假设有两个大整数X、Y,分别设X、Y。利用分治法求X*Y的乘积。
1、不超过long型的正整数
//大整数乘法 p18
#include<iostream>
#include<cmath>
using namespace std;
long Calculate(long X,long Y,int n){
if (X == 0 || Y == 0)
return 0;
else if (n == 1)
return X * Y;
if(n%2) n=n+1;
long A = (long)(X / pow(10, n / 2));
long B = (X % (long)pow(10, n / 2));
long C = (long)(Y / pow(10, n / 2));
long D = (Y % (long)pow(10, n / 2));
long AC = Calculate(A, C, n / 2);
long BD = Calculate(B, D, n / 2);
long ABCD = Calculate((A+B),(C+D),n/2)-AC-BD;
return (long)(AC*pow(10,n)+ABCD*pow(10,n/2)+BD);
}
int main(){
long X,Y,num;
int n=0,m=0;
cin>>X>>Y;
num=X;
while(num>0){
n++;
num=num/10;
}
num=Y;
while(num>0){
m++;
num=num/10;
}
if(n<m) n=m;
cout<<X<<"*"<<Y<<"="<<Calculate(X,Y,n)<<endl;
return 0;
}
/*
1234 567 =699678
*/
2、很大的数
//大整数乘法 p18
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
string a,b;
int n,m;
void mul(string a,string b){
vector<int>res(n+m,0);
int len,flag=0;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
res[i+j]+=(a[i]-'0')*(b[j]-'0');
}
len=res.size();
for(int i=0;i<len;i++){
if(res[i]>=10){
res[i+1]+=res[i]/10;
res[i]=res[i]%10;
}
}
}
reverse(res.begin(),res.end());
for(int i=0;i<len;i++){
if(flag==0){
if(res[i]!=0){
cout<<res[i];flag++;
}
}else{
cout<<res[i];
}
}
}
int main(){
cin>>a>>b;
n=a.size();
m=b.size();
mul(a,b);
return 0;
}
/*
123 456 =56088
8216547 96785 = 795238501395
1234567890 9876543210 =12193163111263526900
*/