1、当大整数需要进行分治乘法时,在两个乘数的高位补0,使它们的位数达到相同的2的次幂;分治结束后,将得到的乘积的高位多余的0去除,进行加减等非分治算法运算;以此类推。采用这种高位补0的位数处理方法,实现了任意位大整数的乘法。 除了上述三点之外,程序对鲁棒性做了增强,对非法输入和文件错误进行了检测。程序设计代码:/*头文件 大数乘法问题.h*/#ifndef KNAP_H#define KNAP_H#include fstreamstringusing namespace std;/*定义数制,范围2到10*/#define SCALE 10/*整数的最大位数*/const int Max = 10
2、00;/*表示整数的结构体*/struct Integer bool positive; /整数的正负 short numMax; /整数的各位数字,下标从0开始 int length; /整数的位数;/*两个整数的乘法类*/class Multiplypublic: Multiply(char *in, char *out); /构造函数 Multiply(); /析构函数 void OutputProduct(); /输出大整数的乘积protected: short CharToInt(char ch); /将数字字符转化成整型 int AddDigit(Integer &X, Integ
3、er &Y); /将位数补充到相同2的次幂位 void InitialInteger(Integer &integer, ifstream &in); /文件初始化大整数 void OutputInteger(Integer integer); /输出大整数integer void ClearZero(Integer &integer); /去除大整数高位多余的0 bool PositiveXGreaterThanY(Integer X, Integer Y); /判断是否非负X大于非负Y bool EqualsToZero(Integer integer); /判断是否等于0 Integer
4、 Zero(); /返回大整数0 Integer GetAbsolute(Integer integer); /返回大整数integer的绝对值 Integer GetNegative(Integer integer); /返回大整数integer的负值 Integer GetLeft(Integer integer); /取大整数integer左一半 Integer GetRight(Integer integer); /取大整数integer右一半 Integer LeftShifting(Integer integer, int digit); /大整数向左移digit位,低位补0 In
5、teger Plus(Integer X, Integer Y); /大整数加法 Integer Subtract(Integer X, Integer Y); /大整数减法 Integer SameSignPlus(Integer X, Integer Y); /同号大整数加法 Integer SameSignSubtract(Integer X, Integer Y); /同号大整数减法 Integer OneDigitMultiply(Integer X, Integer Y); /非负1位大整数乘法 Integer FreeMultiply(Integer X, Integer Y);
6、 /任意大整数乘法 Integer NDigitsMultiply(Integer X, Integer Y, int n); /2的n次幂乘法,高位补0private: Integer integer_X, integer_Y; /数组存储的大整数 ofstream fout; /输出结果文件#endif/*函数实现文件 大数乘法问题.cpp*/#include 大数乘法问题.hMultiply:Multiply(char *in, char *out) : fout(out) try /非法输入检测 ifstream fin(in); if( !fin ) throw 输入文件无法打开!n
7、; InitialInteger(integer_X, fin); /文件初始化大整数integer_X fin.ignore(100, n); /冲掉回车 InitialInteger(integer_Y, fin); /文件初始化大整数integer_Y fin.close(); /关闭文件fout )输出文件无法打开! catch(char *string) cout = SCALE) 输入不符合数制! return temp;int Multiply:AddDigit(Integer &Y) int digit = 0; if(X.length Y.length) digit = X.
8、length; else digit = Y.length; /取二者最大位数 int i; for(i = 0; pow(2.0, i) = X.length; i-) X.numi = 0;= Y.length; Y.numi = 0; /高位补0,使位数达到2的次幂 X.length = Y.length = digit; /改变二者的位数 return digit; /返回2的次幂InitialInteger(Integer &in) if(in.peek() = -) in.get(); integer.positive = false; integer.positive = tru
9、e; char tempMax; in.peek() != & !in.eof(); i+) /读到回车处或文件结束 in tempi; integer.length = i; i integer.length; i+) integer.numi = CharToInt(tempinteger.length - i - 1);/将每一位字符转化为整型OutputInteger(Integer integer) if(integer.length = 0) /结果为0 fout integer.num0; if(integer.positive = false) /结果为负数 fout for(
10、int i = integer.length - 1; -1; integer.numi;ClearZero(Integer &integer) for(int i = integer.length-1; integer.numi = 0 &= 0; integer.length-;bool Multiply:PositiveXGreaterThanY(Integer X, Integer Y) Y.length) /X位数大于Y return true; else if(X.length Y.numi) /某一位X大于Y return true; else if(X.numi SCALE-1
11、) /当为加法需要进位 X.numi = (X.numi + Y.numi + carry_flag) % SCALE; carry_flag = 1; else X.numi = X.numi + Y.numi + carry_flag; carry_flag = 0; if(i X.length) /被加数位数大于加数 while(i SCALE-1) /需要进位 X.numi+ = (X.numi + carry_flag) % SCALE; carry_flag = 1; else X.numi+ = X.numi + carry_flag; carry_flag = 0; else
12、if(i X.numi+ = (Y.numi + carry_flag) % SCALE; X.numi+ = Y.numi + carry_flag; if(carry_flag = 1) /最高位存在进位 X.numi = 1; X.length = i+1; X.length = i; return X;SameSignSubtract(Integer X, Integer Y) if(PositiveXGreaterThanY(X, Y) /如果绝对值X=Y int i; int carry_flag = 0; /借位 bool first_0 = true; /高位第一次出现0 in
13、t top_digit_0 = 0; /记录结果最高位+1的下标 int top_digit = 0; /记录结果最高位下标 for(i = 0; if(X.numi - carry_flag Y.numi) /需要向高位借位 X.numi = (X.numi - carry_flag + SCALE - Y.numi); X.numi = X.numi - carry_flag - Y.numi; if(X.numi = 0) /高位出现0 if(first_0) /且是第一次出现0 first_0 = false; /再出现0则不是第一次出现0 top_digit_0 = i; /记录结果最高位+1的下标 first_0 = true; top_digit = i; if(carry_flag = 1) /最高位存在借位 X.numi = X.numi - carry_flag; if(X.numi = 0 & firs
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1