分治法.大整数乘法.C++实现.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WORD格式整理版 PAGE 范文范例参考 算法设计与分析基础 实验报告 实验名称 分治法求大整数乘法 学 院 计算机学院 专业班级 计算机科学与技术09(2)班 学 号 3109005933 姓 名 黄进杰 指导教师 顾 国 生 2012年1 实验目的 通过上机实验,要求掌握分治法算法的问题描述、算法设计思想、程序设计和算法复杂性分析等。 二、实验环境 C-Free 三、实验内容 (1)问题的描述 通过分治法求两个大整数的乘法 (2)算法设计思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题解合并得到原问题的解。 (3)程序设计 #include iostream #include sstream #include string #include stdlib.h 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 intValue;//将int输入流 stream result;//从stream中抽取前面放入的int值 return result; } //在字符串str前添加s个零 string stringBeforeZero(string str,int s) { for(int i=0;is;i++) { str.insert(0,0); } return str; } //两个大整数字符串相加,超出计算机表示范围的数也能实现相加(本函数可以实现大整数加法运算) string stringAddstring(string str1,string str2) { //假定str1和str2是相等的长度,不相等时在前面自动补零,使两个字符串长度相等 if (str1.size() str2.size()) { str2 = stringBeforeZero(str2,str1.size() - str2.size()); }else if (str1.size() str2.size()) { str1 = stringBeforeZero(str1,str2.size() - str1.size()); } string result; int flag=0;//前一进位是否有标志,0代表无进位,1代表有进位 for(int i=str1.size()-1;i=0;i--) { int c = (str1[i] - 0) + (str2[i] - 0) + flag;//利用ASCII码对字符进行运算,这里加上flag代表的是:当前一位有进位时加1,无进位时加0 flag = c/10;//c大于10时,flag置为1,否则为0 c %= 10;//c大于10时取模,否则为其本身 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) 这个函数的两个参数,第一个代表的其实就是(a1+a0)*(b1+b0),第二个代表的其实就是(a1*b1+a0*b0) 所以本函数里不用考虑最终得到结果为负数的情况,至于计算有关大整数负数相乘的问题可以通过其他途径判断 */ string stringSubtractstring(string str1,st

文档评论(0)

zxiangd + 关注
实名认证
内容提供者

本人从事教育还有多年,在这和大家互相交流学习

1亿VIP精品文档

相关文档