问题描述:
求两个不超过1000位的非负整数的乘积
输入:
有两行,每行是一个不超过1000位的非负整数,没有多余的前导0.
输出:
一行,即相乘后的结果,结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342.
样例输入:
12345678900
98765432100
样例输出:
1219326311126352690000
程序代码:
#include<stdio.h> #include<string.h> #define N 1001 char s1[N]; char s2[N]; int a1[N]; int a2[N]; int b[N*2]; int main() { int i,j,len1,len2; while(~scanf("%s%s",s1,s2)) { memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); memset(b,0,sizeof(b)); len1=strlen(s1); len2=strlen(s2); j=0; for(i=len1-1;i>=0;i--) a1[j++]=s1[i]-'0'; j=0; for(i=len2-1;i>=0;i--) a2[j++]=s2[i]-'0'; for(i=0;i<len2;i++)//每一轮都a1的一位去和a2的各位相乘 for(j=0;j<len1;j++) b[i+j]+=a1[j]*a2[i];//两个数的第i,j位相乘,结果累加到第i+j位 for(i=0;i<N*2;i++) { if(b[i]>=10)//处理进位情况 { b[i+1]+=b[i]/10;//十位进到下一位 b[i]%=10;//保留个位的数 } } bool ans=false; for(i=N*2-1;i>=0;i--)//依次把每一位输出 { if(ans) printf("%d",b[i]); else if(b[i]) { printf("%d",b[i]); ans=true; } } /*if(!ans) printf("0");*/ printf("\n"); } return 0; }