设计一个有效的算法,可以计算两个n位大整数的乘法运算。
如果按照我们日常的计算方法,应该就是将两个数逐位相乘,最后加起来得到最终的结果。由于是大整数乘法,那么我们用string来存储这两个数,因为是要做乘法,我们要从两个数的最低位开始乘,并且难免会有进位,所以我们打算翻转这两个string,使得更好操作一下。
string multiply(string num1,string num2)
{
int len1=num1.length(),len2=num2.length();
int len=len1+len2+1;
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
//tmp储存每次乘法的结果,res储存最后相加的结果
char res[len],tmp[len];
for(int i=0;i=0;i--)
{
//遇到第一个正整数
if(res[i]!='0'&&!flag){
result+=res[i];
flag=true;
}
else if(flag)
result+=res[i];
}
if(result=="") result="0";
return result;
}
但是这样做算法复杂度是O(n^2)。我们想要用复杂度更低的算法来解决这个问题。
如果采取以上算法的话时间复杂度可以降低到O(n^log2(3))。
string Add(string num1,string num2)
{
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
string res;
int len1=num1.length();
int len2=num2.length();
int len=min(len1,len2);
int jw=0;
for(int i=0;ilen2)
{
for(int i=len;i=num2
string Sub(string num1,string num2)
{
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
int len1=num1.length();
int len2=num2.length();
int len=min(len1,len2);
int jw=0;
string res,result;
for(int i=0;i=b)
{
res+=char(a-b+'0');
jw=0;
}
else
{
res+=char(a+10-b+'0');
jw=1;
}
}
for(int i=len;i=b)
{
res+=char(a-b+'0');
jw=0;
}
else if(a=0;i--)
{
if(res[i]!='0'&&!flag)
{
result+=res[i];
flag=true;
}
else if(flag)
result+=res[i];
}
return result;
}
//两个n位大整数的乘法
string Multiply1(string num1,string num2,int n)
{
string a,b,c,d,ac,ad,bc,bd,adbc;
a=num1.substr(0,n/2);
b=num1.substr(n/2);
c=num2.substr(0,n/2);
d=num2.substr(n/2);
ac=multiply(a,c);
ad=multiply(a,d);
bc=multiply(b,c);
bd=multiply(b,d);
adbc=Add(ad,bc);
for(int i=0;i