ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:20.54KB ,
资源ID:18623162      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18623162.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大整数乘法问题Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

大整数乘法问题Word格式文档下载.docx

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