Sample Input
12
12
2
222222222222222222222222
Sample Output
144
444444444444444444444444
大数乘法,把字符串反过来储存在int型数组中
如s1[i] 2 1 0
乘数 1 2 5
S2[j] 2 1 0
乘数 1 2 5
5和5相乘的结果在0位,2和5相乘的结果在第1位,所以发现第i位乘以第j位的值在第i+j位,由此可以直接模拟乘法运算,但是数据可能为000001*0000001,最后要检查前导0
#include<stdio.h>
#include<string.h>
int main()
{
int n,m;
char a[300],b[300];
int s1[300],s2[300],s[11000];
while(~scanf("%s%s",a,b))
{
for(int i=0; i<300; i++)
s1[i]=s2[i]=0;
memset(s,0,sizeof(s));
n=strlen(a);
m=strlen(b);
int j=0,k=0;
for(int i=n-1; i>=0; i--)
s1[j++]=a[i]-'0';
for(int i=m-1; i>=0; i--)
s2[k++]=b[i]-'0';
int i,t,p;
for( i=0; i<j; i++)
for(t=0; t<k; t++)
{
s[i+t]+=s1[i]*s2[t];
if(s[i+t]>9)
{
s[i+t+1]+=s[i+t]/10;
s[i+t]=s[i+t]%10;
}
}
p=i+t;
while(s[p-1]>9)
{
s[p]+=s[p-1]/10;
s[p-1]=s[p-1]%10;
p++;
}
for( ;;) //去掉前导0
{
if(s[p]!=0||p==0)
break;
if(s[p]==0)
p--;
}
for(int f=p; f>=0; f--)
printf("%d",s[f]);
printf("\n");
}
return 0;
}