大整数乘法
递归与分治解决
运用递归把大整数abcd…的每个位数提取出来,按照a10^n + b * 10^n-1 + c * 10 ^n-2+…
在这里用分治将第一个整数化为2部分AB,第二个整数化为CD然后分而治之
然后按照乘法法则进行展开,这就是递归公式:
然后进行变换将AD+BC化为由AC,BD的式子**(A-C)*(D-B)+AB+CD**减少计算,减少时间复杂度
而递归的结束条件是当位数为1时,返回计算结果,还有当出现0时也结束递归。在这里由于不知道整数的正负号,所以设置了一个flag函数判断并保存最后结果的符号,而后继续进行递归,分治求解
具体代码如下
#include<bits/stdc++.h>
#define l long
using namespace std;
const int N=1005;
int a[N];
int flag(long v)//判断符号函数
{
return v>0 ? 1:0;
}
l solve(l x,l y,int n)
{
int f=flag(x)*flag(y);
x=abs(x);
y=abs(y);
if(x==0||y==0)
return 0;//当出现0时计算结果为0
else if(n==1)
return x*y*f;//返回计算结果
else{
l A=(l)(x/pow(10,n/2));
l B=(x%(l)pow(10,n/2));
l C=(l)(y/pow(10,n/2));
l D=(y%(l)pow(10,n/2));
l AC=solve(A,C,n/2);
l BD=solve(B,D,n/2);
l ABCD=solve(A-B,D-C,n/2);
return (l)(f*(AC*pow(10,n)+BD*pow(10,n/2)+ABCD));
}
}
int num(l n,int i)//求整数的位数
{
if(n<10){
i++;
return i;
}
num(n/10,i);
}
int main(){
l N,k;
while(cin>>N>>k)
{
int t=num(N,0);
cout<<solve(N,k,t)<<endl;
//cout<<Min<<" "<<Max<<endl;
//printf("%.4lf\n",fx1(z,b));
}
return 0;
}