1.分治法
#include<bits/stdc++.h>
using namespace std;
string zero(int n)
{
if(n==0)
return "";
if(n==1)
return "0";
return zero(n/2)+zero(n/2)+zero(n%2);
}
int toint(string x)
{
int res;
stringstream ss;
ss << x;
ss >> res;
return res;
}
string tostring(int y)
{
string res;
stringstream ss;
ss << y;
ss >> res;
return res;
}
string add(string a,string b)
{
if(a.length()<=8&&b.length()<=8)
{
return tostring(toint(a)+toint(b));
}
string a1="0";
string a2=a;
if(a.length()>8)
{
a1=a.substr(0,a.length()-8);
a2=a.substr(a.length()-8);
}
string b1="0";
string b2=b;
if(b.length()>8)
{
b1=b.substr(0,b.length()-8);
b2=b.substr(b.length()-8);
}
string t=add(a2,b2);
while(t.length()<8)
t="0"+t;
if(t.length()>8)
return add(add(a1,b1),"1")+t.substr(1);
return add(a1,b1)+t;
}
string multi(string a,string b)
{
if(a.length()<=4&&b.length()<=4)
{
return tostring(toint(a)*toint(b));
}
if(a.length()>4)
{
int k=a.length()/2;
string a1=a.substr(0,k);
string a2=a.substr(k);
return add(multi(a1,b)+zero(a2.length()),multi(a2,b));
}
return multi(b,a);
}
int main()
{
string a,b;
cin>>a>>b;
cout<<multi(a,b);
return 0;
}
2.二重循环法(ACM)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string n,m; //两个要输入的大整数
int a[2000],b[2000],mul[2000]; //保存相乘的每一个数
cin>>n>>m;
int L1=n.length();
int L2=m.length();//得出输入的两个数的长度
memset(mul,0,sizeof(mul));//初始化结果数组
for(int i=1;i<=L1;i++) //将所有的字符串转化为int型
a[i]=n[L1-i]-'0';
for(int j=1;j<=L2;j++)
b[j]=m[L2-j]-'0';
for(int i=1;i<=L1;i++)
{
//进位的数
int sum=0;
for(int j=1;j<=L2;j++)
{
//现在的这位位原来此位的值加上进位的值加上原来就需要储存的值
mul[i+j-1]=a[i]*b[j]+mul[i+j-1]+sum;
//计算进位的值
sum=mul[i+j-1]/10;
//保存现在此位的数值
mul[i+j-1]=mul[i+j-1]%10;
}
//最高位从头到尾没有运算,,应该是只有两个最高为的相乘
mul[i+L2]=sum;
}
if(mul[L1+L2]!=0) //如果最高为不是0 要将他输出
cout<<mul[L1+L2];
for(int i=L1+L2-1;i>=1;i--) //按顺序输出乘积的值
cout<<mul[i];
return 0;
}