对于大数问题,最好的解决方法就是通过字符串(字符数组)向整形数组转换,并进行一系列的操作(四则运算)。并以数组的形势输出结果。因为这一次是建立在大数相加与大数相乘的基础上的,所以对减法,除法不做解释。但,我相信,即便是减法,除法与加,乘有这样或那样的区别,但究其根本思想还是相同的。
注意:在进行运算时,最好是将输入的字符数组的顺序颠倒,以便使清楚地知道数的位数,尤其在乘法中方便取位。而随带的就要格外注意在输出时首位会有“0”的出现,这时就需要将首位的“0”删去。
乘法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s[105],l[105];
int i,e,n,m,sn[105],ln[105],t[105]= {0},g,f=0;
gets(s);
gets(l);
n=strlen(s);
m=strlen(l);
for(i=n-1; i>=0; i--)
sn[n-1-i]=s[i]-'0';
for(i=m-1; i>=0; i--)
ln[m-1-i]=l[i]-'0';
for(i=0; i<n; i++)
for(e=0; e<m; e++)
{
g=t[i+e]+ln[e]*sn[i];
if(g>=10)
{
t[i+e]=g%10;
t[i+1+e]+=g/10;
}
else
t[i+e]=g;
}
for(i=n+m; i>=0; i--)
{
if(t[i])
f=1;
if(f || i==0)
printf("%d",t[i]);//删去首位的“0”
}
printf("\n");
return 0;
}
加法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char g[105]= {NULL};
int t[105]= {0},a[1000]= {0},l,i,j;
while(scanf("%s",g)!=EOF&&strcmp(g,"0")!=0)
{
l=strlen(g);
for(i=0; i<l; i++)
if(g[i]=='NULL')
break;
for(i=l-1,j=0; i>=0; i--,j++)
{
t[j]+=g[i]-'0';
if(t[j]>9)
{
t[j]=t[j]%10;
t[j+1]+=1;
}
}
}
if(t[l]!=0)
printf("%d",t[l]);
for(i=l-1; !t[i]; i--);
for(j=i; j>=0; j--)
{
printf("%d",t[j]);
}
printf("\n");
return 0;
}