- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)