分治法求2个大整数相乘

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cin>>num2;
i=-1;
}
}
r=IntMult(num1,num2);
while ('0' == r[0]&&r.size()>1)
{r=r.substr(1,r.size()-1);}
cout<<"相乘结果为:"<<endl;
cout<<num1<<" "<<"*"<<" "<<num2<<" "<<"="<<" "<<r<<endl<<endl;
{f*=2;}
if (x.size() != f)
{
x = stringBeforeZero(x,f-x.size());
y = stringBeforeZero(y,f-y.size());
}
}else//第二个数长度大于第一个数长度的情况
{
while (y.size()>f) //判断f值
{f*=2;}
if (y.size() != f)
{
x = stringBeforeZero(x,f-x.size());
y = stringBeforeZero(y,f-y.size());
}
}
}
if (1 == x.size())
{x=stringBeforeZero(x,1);}
if (1 == y.size())
#include <string>
#include <stdlib.h>
using namespace std;
int string_to_num(string k)
{
int back;
stringstream instr(k);
instr>>back;
return back;
}
string num_to_string(int intValue)//整形数转换为string类型
int s = x.size();
string a1,a0,b1,b0;
if( s > 1)
{
a1 = x.substr(0,s/2);
a0 = x.substr(s/2,s-1);
b1 = y.substr(0,s/2);
b0 = y.substr(s/2,s-1);
}
strwenku.baidu.comng result;
{
string result;
stringstream stream;
stream << intValue;
stream >> result;
return result;
}
string stringBeforeZero(string str,int s)
{
for(int i=0;i<s;i++)
{str.insert(0,"0");}
string s1=stringFollowZero(c1,s/2);// c1*(10^(n/2))
string s2=stringFollowZero(c2,s);// c2*(10^n)
result = stringAddstring(stringAddstring(s2,s1),c0);// c2*(10^n) + c1*(10^(n/2)) + c0
}
四、程序结果
图1、程序运行结果
五、结果分析
用分治法实现对两个大整数相乘,还是相当好用,本程序没有规定两个大整数具体的位数,只要在处理器能力范围内的相乘算法都能实现。
else if (str1.size() < str2.size())
{str1 = stringBeforeZero(str1,str2.size() - str1.size());}
string result;
int flag=0;
for(int i=str1.size()-1;i>=0;i--)
}
return result;
}
void main()
{
string A,B,C,D;
string num1,num2;
string r;
cout<<"请输入第一个大整数:";
cin>>num1;
int i=0;
for(i=0 ;i < num1.size();i++)
{
if (num1[i]<'0' || num1[i]>'9')
}
else{ //长度不为2时利用分治法进行递归运算
string c2 = IntMult(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 c1_4 = stringAddstring(c2,c0);// (c2 + c0)
string c1=stringSubtractstring(c1_3,c1_4);// (a1 + a0)*(b1 + b0)-(c2 + c0)
分治法求2个大整数相乘
一、问题描述
利用分治法实现两个大整数的乘法。
二、算法设计思想
将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题解合并得到原问题的解。
三、程序实现
#include <iostream>
#include <sstream>
{cout<<"您输入的数据不合法,请重新输入!"<<endl;
cin>>num1;
i=-1;
}
}
cout<<"请输入第二个大整数:";
cin>>num2;
for(i=0 ;i < num2.size();i++)
{
if (num2[i]<'0' || num2[i]>'9')
{cout<<"您输入的数据不合法,请重新输入!"<<endl;
return str;
}
string stringAddstring(string str1,string str2) //实现大整数加法
{
if (str1.size() > str2.size())
{str2 = stringBeforeZero(str2,str1.size() - str2.size());}
{str.insert(str.size(),"0");}
return str;
}
string IntMult(string x,string y)//递归函数//分治法大整数乘法实现函数
{
while ('0' == x[0]&&x.size()>1)
{x=x.substr(1,x.size()-1);}
{y=stringBeforeZero(y,1);}
if (x.size() > y.size())
{y = stringBeforeZero(y,x.size()-y.size());}
if (x.size() < y.size())
{x = stringBeforeZero(x,y.size()-x.size());}
while ('0' == y[0]&&y.size()>1)
{y=y.substr(1,y.size()-1);}
int f=4;
if (x.size()>2 || y.size()>2)
{
if (x.size() >= y.size()) //第一个数长度大于等于第二个数长度的情况
{
while (x.size()>f) //判断f值
return result;
}
string stringSubtractstring(string str1,string str2)
{
while ('0' == str1[0]&&str1.size()>1)
{str1=str1.substr(1,str1.size()-1);}
while ('0' == str2[0]&&str2.size()>1)
if( s == 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));
{
int c = (str1[i] - '0') + (str2[i] - '0') + flag;
flag = c/10;
c %= 10;
result.insert(0,num_to_string(c));
}
if (0 != flag)
{result.insert(0,num_to_string(flag));}
{
int c = (str1[i] - '0') - (str2[i] - '0');
if (c < 0){
c +=10;
int prePos = i-1;
char preChar = str1[prePos];
while ('0' == preChar) {
str1[prePos]='9';
prePos -= 1;
{str2=str2.substr(1,str2.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--)
preChar = str1[prePos];}
str1[prePos]-=1;
}
result.insert(0,num_to_string(c));
}
return result;
}
string stringFollowZero(string str,int s)
{
for(int i=0;i<s;i++)
相关文档
最新文档