用分治算法编程实现两个n位十进制大整数的乘法运算。
分析
用分治算法编程实现两个n位十进制大整数的乘法运算。
算法描述
两个十进制的数 X ,Y;
X= A*10^n1 +B
Y= C*10^n2 +D
则 X*Y=(A*10^n1+B)*(C*10^n2+D)
设一个数组,将其看做10000进制,然后按照乘法运算,如果设大于10000的进制,则两数相乘很有可能超过int的数据范围所以设10000进制)
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
char c1[100];
char c2[100];
int num1[200];
int num2[100];
int result[205];
int l1,l2;
//将字符串转化为10000进制的数字
int change(int l,int num[],char c[])
{
int k,i,j,r;
r=l%4;
k=0;
for(i=l-1;i>=r;i-=4){
for(j=i;j>i-4;j–){
int d=c[j]-‘0’;
num[k]+=pow(10,(i-j))*d;
}
k++;
}
if(r!=0)
for(i=r-1;i>=0;i–)
num[k]+=pow(10,(r-1-i))*(c[i]-‘0’);
k++;
return k;
}
//打印
void print(int l){
int k=0,i;
int flag=0;
for(i=200-1;i>=0;i–){
if(result[i]!=0&&!flag){
cout<<result[i];
flag=1;
}
else{
if(flag){
if(result[i]/1000!=0)
cout<<result[i];
else if(result[i]/100!=0)
cout<<“0″<<result[i];
else if(result[i]/10)
cout<<“00″<<result[i];
else if(result[i]!=0)
cout<<“000″<<result[i];
else cout<<“0000”;
}
}
}
}
//乘法
void fun(){
int i,j,c;
c=0;
for(i=0;i<l2;i++){
c=0;
for(j=0;j<15;j++){
result[j+i]+=num1[j]*num2[i]+c;
c=result[j+i]/10000;
result[j+i]%=10000;
}
}
print(l1);
}
int main()
{
cin>>c1>>c2;
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(result,0,sizeof(result));
l1=strlen(c1);
l2=strlen(c2);
l1=change(l1,num1,c1);
l2=change(l2,num2,c2);
fun();
return 0;
}