相同位数的大整数乘法

大整数乘法

递归与分治解决

运用递归把大整数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;
}

发布了57 篇原创文章 · 获赞 5 · 访问量 2817

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/105083552