对大数用Karatsuba进行处理,采用递归的方式,将结果储存到数组,并进行输出,这是一种分治的思想。
算法部分
n1=n1-1;
n=n1+n1%2;
for(int i=0;i<n/2;i++)
{
nn*=10;
}
a=num1/nn;//算法部分
b=num1%nn;
c=num2/nn;
d=num2%nn;
t1=kra(a,c);
t3=kra(b,d);
t2=kra(a+b,c+d)-t1-t3;
不断递归拆分大数字。
代码实现
#include<iostream>
#include<string>
#include "math.h"
#include<stdlib.h>
using namespace std;
//int *sum_z=(int*)malloc(sizeof(int)*30);
int sum_z[40]={0};//相乘数的最大位数
long long kra(long long num1, long long num2)
{
long long n=0;
long long nn=1;
long long n1=0;
long long t1=0;
long long t2=0;
long long t3=0;
long long t_2=0;
long long t_1=0;
long long t_3=0;
long long k1=1;
long long k2=1;
long long a,b,c,d;
long long num3=0;
long long l=0;
long long len=0;
long long len1=0;
long long sum_e=0;
long long m_0;//记录数组最大的位置
if(num1>=num2)//对传入值进行判断,找出大的
{
num3=num1;
}
else
{
num3=num2;
}
while(num3>=1)//求出位数
{
num3/=10;
n1++;
}
if(num1==0&&num2==0)
{
return 0;
}
if(n1==1||n1==2)
{
return num1*num2;
}
if(num1!=0&&num2!=0&&num1!=1&&num2!=1)
{
n1=n1-1;
n=n1+n1%2;
for(int i=0;i<n/2;i++)
{
nn*=10;
}
a=num1/nn;//算法部分
b=num1%nn;
c=num2/nn;
d=num2%nn;
t1=kra(a,c);
t3=kra(b,d);
t2=kra(a+b,c+d)-t1-t3;
for(int i=0;i<n;i++)
{
k1*=10;
len1++;
}
for(int i=0;i<n/2;i++)
{
k2*=10;
len++;
}
int t33[40]={0};
t_3=t3;
while(t_3>0)
{
t33[l++]=t_3%10;
t_3=t_3/10;
}
int t22[40]={0};
l=len;
t_2=t2;
while(t_2>0)
{
t22[l++]=t_2%10;
t_2=t_2/10;
}
l=len1;
int t11[40]={0};
t_1=t1;
while(t_1>0)
{
t11[l++]=t_1%10;
t_1=t_1/10;
}
for(int i=0;i<40;i++)//对t1,t2,t3,进行进位
{
sum_e=t33[i]+t22[i]+t11[i];
if(sum_e>=10)
{
if(sum_e>=20)
{
t33[i+1]+=1;
sum_e=sum_e%10;
}
else
{
t33[i+1]+=1;
sum_e=sum_e%10;
sum_z[i]=sum_e;
}
}
else
sum_z[i]=sum_e;
m_0=i;
}
return t1*k1+t2*k2+t3;
}
}
int main(void)
{ long long a=0;
long long b=0;
int o=40;
for(int i=0;i<10;i++)
{ printf("请输入x:");
scanf("%lld",&a);
printf("\n");
printf("请输入y:");
scanf("%lld",&b);
kra(a, b);
printf("两数相乘结果是\n");
for(int p=0;p<45;p++)
{
if(sum_z[o]==0)
{
o--;
}
}
for(;o+1>0;o--)
{
printf("%d",sum_z[o]);
}
printf("\n");
o=30;
}
return 0;
}
运行结果
最后结果最大位数到40位,大于将溢出数组,代码很乱,请多多见谅。