在上算法课时,王晓东版的在大整数乘法那一章并没有给出具体的程序,在网上搜索大体上也是基于笔算而写出的算法,所以基于此我自己编写了一个基于递归实现的算法和大家交流下,当输入数据太大时,程序也会死掉,求解。
源代码,编译成.cpp文件即可运行。
===========================================
#include<stdio.h>
#include<string.h>
#include<math.h>
void display(int num[]) //大整数输出
{
int i=num[0];
while(0==num[i])
i--;
for(;i>=1;i--)
printf("%d",num[i]);
}
void align(int *num1,int *num2) //对大整数进行对阶,方便处理
{
/* if(num1[0]>=num2[0])
{
if(num1[0]%2==0)
{
for(int i=num2[0]+1;i<=num1[0];i++)
num2[i]=0;
num2[0]=num1[0];
}
else
{
num1[0]+=1;
num1[num1[0]]=0;
for(int i=num2[0]+1;i<=num1[0];i++)
num2[i]=0;
num2[0]=num1[0];
}
}
else
{
if(num2[0]%2==0)
{
for(int i=num1[0]+1;i<=num2[0];i++)
num1[i]=0;
num1[0]=num2[0];
}
else
{
num2[0]+=1;
num2[num2[0]]=0;
for(int i=num1[0]+1;i<=num2[0];i++)
num1[i]=0;
num1[0]=num2[0];
}
}*/
int ol,max;
ol=0;
max=num1[0];
if(num2[0]>max)
max=num2[0];
while(pow(2,ol)<max)
ol++;
max=(int)pow(2,ol);
for(int i=num1[0]+1;i<=max;i++)
num1[i]=0;
for(i=num2[0]+1;i<=max;i++)
num2[i]=0;
num1[0]=max;
num2[0]=max;
printf("max=%d\n",max);
}
void fun1(char *c,int *num) //处理字符串
{
int i;
num[0]=strlen(c); //a[0]存储数的位数
for(i=0;i<num[0];i++)
{
num[num[0]-i]=c[i]-'0';
}
}
void add(int num1[],int num2[],int num[]) //两个大整数相加
{
int i;
if(num1[0]>=num2[0])
{
num[0]=num1[0];
for(i=1;i<=num2[0];i++)
{
num[i]=num1[i]+num2[i];
}
for(;i<=num[0];i++)
{
num[i]=num1[i];
}
for(i=1;i<=num[0];i++)
{
if(num[i]>=10)
{
num[i+1]+=num[i]/10;
num[i]%=10;
}
}
}
else
{
num[0]=num2[0];
for(i=1;i<=num1[0];i++)
{
num[i]=num1[i]+num2[i];
}
for(;i<=num[0];i++)
{
num[i]=num2[i];
}
for(i=1;i<=num[0];i++)
{
if(num[i]>=10)
{
num[i+1]+=num[i]/10;
num[i]%=10;
}
}
}
}
void addfun(int *num1,int *num2,int *num3,int *num4,int *num) //四个大整数相加
{
int temp1[1000],temp2[1000];
add(num1,num2,temp1);
add(num3,num4,temp2);
add(temp1,temp2,num);
}
void getRight(int *num,int *a,int n) //获得num右边的n位赋给a
{
a[0]=n;
for(int i=1;i<=n;i++)
a[i]=num[i];
}
void getLeft(int *num,int *a,int n) //获得num左边的n位赋给a
{
a[0]=n;
for(int i=1;i<=n;i++)
a[i]=num[i+n];
}
int *moveR(int *num,int n) //十进制大数右移n位
{
for(int i=1;i<=n;i++)
{
for(int j=num[0];j>=1;j--)
num[j+1]=num[j];
num[i]=0;
num[0]++;
}
return num;
}
int *mult(int num1[],int num2[],int n) //大整数乘法
{
int *num=new int(2*(n+1));
int a[1000],b[1000],c[1000],d[1000];
if(n==1)
{
num[n]=num1[n]*num2[n];
num[0]=2;
num[2]=0;
if(num[1]>=10)
{
num[2]=num[1]/10;
num[1]%=10;
}
return num;
}
else
{
getLeft(num1,a,n/2);
getRight(num1,b,n/2);
getLeft(num2,c,n/2);
getRight(num2,d,n/2);
addfun(moveR(mult(a,c,n/2),n),moveR(mult(a,d,n/2),n/2),moveR(mult(b,c,n/2),n/2),mult(b,d,n/2),num);
return num;
}
}
void main() //主函数
{
char a[1000],b[1000];
int num1[1000],num2[1000];
int *num=new int[1000];
printf("num1 = ");
scanf("%s",a);
printf("\n");
printf("num2 = ");
scanf("%s",b);
printf("\n");
fun1(a,num1);
fun1(b,num2);
align(num1,num2);
num=mult(num1,num2,num1[0]);
display(num1);
printf(" * ");
display(num2);
printf(" = ");
display(num);
printf("\n");
}