使用分治算法实现两个大整数相乘。
输入
两个十进制大整数,满足每一个整数长度为2^n且两个大整数的长度相等。(多组数据)
输出
两个大整数的乘积。
样例输入 Copy
1234 5678
样例输出 Copy
7006652
芭比Q了这图片老是反的。。。。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int solve(int n,int m,int len){
if(n==0||m==0)return 0;
else if(len==1)return n*m;
else{
int length=len/2;//注意区分代码中的len与length,len是这一次分治长度,length是下次滴
int sum=pow(10,length);
ll a=n/sum;
ll b=n%sum;
ll c=m/sum;
ll d=m%sum;
ll ac=solve(a,c,length);
ll bd=solve(b,d,length);
ll abdc=solve((a-b),(d-c),length)+ac+bd;//这里要观察ac,bd已经计算过了
//因为书上是用的XY=AC*pow(2,n)+((A-B)(D-C)+AC+BD)*pow(2,n)+BD
return (ac*pow(10,len)+(abdc*pow(10,length))+bd);
}
}
int main(){
int n,m;
while(cin>>n>>m){
int temp=n;
int len=0;
while(temp){
len++;
temp/=10;
}
ll sum=solve (n,m,len);
printf("%lld\n",sum);
}
return 0;
}