C语言大数相乘(整形)
我们在用C语言运算时int存不下很大的数字无法直接计算大数相乘,那么这时候就需要把数字当作字符先存下来,然后存入数组中一部分一部分的进行运算。我通过-纸短情长大佬的这篇博客理解了大数相乘的基本思路,并引用大佬的代码,但大佬没有讲的很细,我将我自己的理解发表出来以供参考,如有侵权请联系我删除。
首先给出这个图,对照这张图方便理解代码
下面是代码:
//大数乘法
#include<stdio.h>
#include<math.h>
#include<string.h>
#define M 10005
char s1[M],s2[M],s[M];
int a[M],b[M],c[M];
int main()
{
int i,j,m,n,k;
while(~scanf("%s%s",s1,s2))
{
memset(c,0,sizeof(c));
n=strlen(s1);
m=strlen(s2);
k=n+m;//保证相乘后的位数不会大于k
printf("s1的长度=%d s2的长度=%d\n",n,m);
/*-----------------把字符串s1和s2 逆序 用数字排列-------------*/
for(i=0; i<n; i++)
a[i]=s1[n-i-1]-'0'; //字符型减'0'可以得到整数型
for(i=0; i<m; i++)
b[i]=s2[m-1-i]-'0';
/*------------------乘运算存入c中------------------*/
for(i=0; i<m; i++)
for(j=0; j<n; j++)
c[i+j]+=a[j]*b[i];
/*-----------------进位运算得到结果----------------*/
for(i=0; i<=k; i++)
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;//进位
c[i]%=10;
}
}
/*-------------去除前导0---------------*/
i=k;
while(c[i]==0) i--;
/*判断两个非负数之积是否为0,以及逆序打印c[]*/
if(i<0) printf("0");
else
{
for(; i>=0; i--)
printf("%d",c[i]);
}
printf("\n");
}
return 0;
}