分治法大整数乘法C++实现_第1页
分治法大整数乘法C++实现_第2页
分治法大整数乘法C++实现_第3页
分治法大整数乘法C++实现_第4页
分治法大整数乘法C++实现_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-PAGE . z算法设计与分析根底实验报告实验名称 分治法求大整数乘法 学 院 计算机学院 专业班级 计算机科学与技术09(2)班 学 号3109005933 姓 名 黄进杰 指导教师 顾 国 生 2012年12月03日实验目的通过上机实验,要求掌握分治法算法的问题描述、算法设计思想、程序设计和算法复杂性分析等。二、实验环境C-Free三、实验容1问题的描述通过分治法求两个大整数的乘法2算法设计思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题一样。递归地解这些子问题,然后将各个子问题解合并得到原问题的解。3程序设计*include *include *inc

2、lude *include using namespace std; /string类型转换成int类型int string_to_num(string k)/string字符串变整数型例如str=1234,转换为整数的1234. int back; stringstream instr(k); instrback; return back; /整形数转换为string类型string num_to_string(int intValue)string result;stringstream stream;stream result;/从stream中抽取前面放入的int值return res

3、ult;/在字符串str前添加s个零string stringBeforeZero(string str,int s)for(int i=0;i str2.size() str2 = stringBeforeZero(str2,str1.size() - str2.size();else if (str1.size() =0;i-)int c = (str1i - 0) + (str2i - 0) + flag;/利用ASCII码对字符进展运算,这里加上flag代表的是:当前一位有进位时加1,无进位时加0flag = c/10;/c大于10时,flag置为1,否则为0c %= 10;/c大于1

4、0时取模,否则为其本身result.insert(0,num_to_string(c);/在result字符串最前端插入新生成的单个字符if (0 != flag) /最后一为(最高位)判断,如果有进位则再添一位result.insert(0,num_to_string(flag); return result;/*两个大整数字符串相减,超出计算机表示围的数也能实现相减(在这里比拟特殊,第一个参数一定大于第二个参数,因为:a1*b0+a0*b1=(a1+a0)*(b1+b0)-(a1*b1+a0*b0) 0 ,所以(a1+a0)*(b1+b0) (a1*b1+a0*b0)这个函数的两个参数,第

5、一个代表的其实就是(a1+a0)*(b1+b0),第二个代表的其实就是(a1*b1+a0*b0)所以本函数里不用考虑最终得到结果为负数的情况,至于计算有关大整数负数相乘的问题可以通过其他途径判断*/string stringSubtractstring(string str1,string str2)/对传进来的两个数进展修剪,如果前面几位有0则先去掉,便于统一处理while (0 = str10&str1.size()1)str1=str1.substr(1,str1.size()-1);while (0 = str20&str2.size()1)str2=str2.substr(1,str

6、2.size()-1);/使两个字符串长度相等if (str1.size() str2.size() str2 = stringBeforeZero(str2,str1.size() - str2.size(); string result;for(int i=str1.size()-1;i=0;i-)int c = (str1i - 0) - (str2i - 0);/利用ASCII码进展各位减法运算if (c 0) /当不够减时向前一位借位,前一位也不够位时再向前一位借位,依次如下c +=10;int prePos = i-1; char preChar = str1prePos;whil

7、e (0 = preChar) str1prePos=9;prePos -= 1;preChar = str1prePos;str1prePos-=1;result.insert(0,num_to_string(c);/在result字符串最前端插入新生成的单个字符return result;/在字符串str后跟随s个零string stringFollowZero(string str,int s)for(int i=0;i1)*=*.substr(1,*.size()-1);/对传进来的第二个数进展修剪,如果前面几位有0则先去掉,便于统一处理while (0 = y0&y.size()1)

8、y=y.substr(1,y.size()-1);/*这里的f变量代表在两个数据字符串长度不想等或者不是2的指数倍的情况下,所要统一的长度,这样做是为了让数据长度为2的n次方 的情况下便于利用分治法处理*/int f=4;/*当两字符串中有任意一个字符串长度大于2时都要通过与上面定义的f值进展比拟,使其到达数据长度为2的n次方,实现方式是在前面 补0,这样可以保证数据值大小不变*/if (*.size()2 | y.size()2) if (*.size() = y.size() /第一个数长度大于等于第二个数长度的情况while (*.size()f) /判断f值f*=2;if (*.siz

9、e() != f) * = stringBeforeZero(*,f-*.size();y = stringBeforeZero(y,f-y.size();else/第二个数长度大于第一个数长度的情况while (y.size()f) /判断f值f*=2;if (y.size() != f) * = stringBeforeZero(*,f-*.size();y = stringBeforeZero(y,f-y.size();if (1 = *.size() /数据长度为1时,在前面补一个0(这里之所以会出现长度为1的数据是因为前面对数据修剪过)*=stringBeforeZero(*,1);

10、if (1 = y.size() /数据长度为1时,在前面补一个0(这里之所以会出现长度为1的数据是因为前面对数据修剪过)y=stringBeforeZero(y,1);if (*.size() y.size() /最后一次对数据校正,确保两个数据长度统一y = stringBeforeZero(y,*.size()-y.size();if (*.size() 1) a1 = *.substr(0,s/2); a0 = *.substr(s/2,s-1); b1 = y.substr(0,s/2); b0 = y.substr(s/2,s-1); string result; if( s =

11、2) /长度为2时代表着递归的完毕条件 int na = string_to_num(a1); int nb = string_to_num(a0); int nc = string_to_num(b1); int nd = string_to_num(b0); result = num_to_string(na*10+nb) * (nc*10+nd); else /长度不为2时利用分治法进展递归运算/*小提示:c = a*b = c2*(10n) + c1*(10(n/2) + c0;a = a1a0 = a1*(10(n/2) + a0;b = b1b0 = b1*(10(n/2) + b

12、0;c2 = a1*b1; c0 = a0*b0;c1 = (a1 + a0)*(b1 + b0)-(c2 + c0);*/string c2 = IntMult(a1,b1);/ (a1 * b1)string c0 = IntMult(a0,b0);/ (a0 * b0) string c1_1 = stringAddstring(a1,a0);/ (a1 + a0) string c1_2 = stringAddstring(b1,b0);/ (b1 + b0) string c1_3 = IntMult(c1_1,c1_2);/ (a1 + a0)*(b1 + b0) string c

13、1_4 = stringAddstring(c2,c0);/ (c2 + c0) string c1=stringSubtractstring(c1_3,c1_4);/ (a1 + a0)*(b1 + b0)-(c2 + c0)string s1=stringFollowZero(c1,s/2);/ c1*(10(n/2) string s2=stringFollowZero(c2,s);/ c2*(10n) result = stringAddstring(stringAddstring(s2,s1),c0);/ c2*(10n) + c1*(10(n/2) + c0 return resu

14、lt; int main() int f=1;while (1 = f)string A,B,C,D; string num1,num2; string r;system(title 3109005933 09计科02班 黄进杰 分治法大整数乘法);system(color 0a);cout大整数乘法运算(分治法实现)endl;coutnum1;int i=0;/判断第一个输入的数据是否合法,当字符串中包含非数字字符时提示用户重新输入for(i=0 ;i num1.size();i+)if (num1i9) cout您输入的数据不合法,请输入有效的整数!num1;i=-1;coutnum2;/判断第二个输入的数据是否合法,当字符串中包含非数字字符时提示用户重新输入for(i=0 ;i num2.size();i+)if (num2i9) cout您输入的数据不合法,请输入有效的整数!num2;i=-1;r=IntMu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论