前几天看到了大整数加法的算法,觉得十分有趣,遂决定自己写一个大证书乘法,代码如下!
#include <stdio.h>
#include <string.h>
#define size 200
void mod(int sum[],int i) //进位
{
if(sum[i]>=10)
{
sum[i+1]+=(sum[i]/10);
sum[i]%=10;
}
}
void mod_2(int (*s)[420],int i,int j) //作用等同于上面的函数的作用,可舍弃
{
if(s[i][j]>=10)
{
(s[i][j+1])+=(s[i][j]/10);
s[i][j]%=10;
mod_2(s,i,j+1);
}
}
int main()
{
int a[size+10],b[size+10];
int s[size+10][2*size+20],sum[2*size+20];
char c[size+10],d[size+10];
int i,j=0,k,flag=0,temp=0;
int length1,length2;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(sum,0,sizeof(sum));
memset(s,0,sizeof(s));
printf("请输入整数a:");
scanf("%s",c);
printf("请输入整数b:");
scanf("%s",d);
length1=strlen(c);
length2=strlen(d);
for(i=length1-1;i>=0;i--)
a[j++]=c[i]-'0';
j=0;
for(i=length2-1;i>=0;i--)
b[j++]=d[i]-'0';
for(i=0;i<size+10;i++)
{
k=temp;
for(j=0;j<size+10;j++)
{
s[i][k++]=s[i][k-1]+a[i]*b[j]; //产生的进位不能忽略
mod_2(s,i,k-1);
}
temp++;
}
for(i=0;i<size+10;i++)
{
flag=0;
for(j=2*size+20-1;j>=0;j--)
{
if(flag)
printf("%d",s[i][j]);
else
if(s[i][j])
{
printf("%d",s[i][j]);
flag=1;
}
}
if(flag)
printf("\n");
}
for(i=0;i<2*size+10;i++)
{
for(j=0;j<size+10;j++)
{
sum[i]+=s[j][i];
if(sum[i]>=10)
mod(sum,i);
}
}
printf("两个大整数的积为:\n");
printf("\n\n");
flag=0;
for(i=2*size+20-1;i>=0;i--) //控制打印的结果,去除先导0
{
if(flag)
printf("%d",sum[i]);
else
if(sum[i])
{
printf("%d",sum[i]);
flag=1;
}
}
return 0;
}