ZJUTOJ大数乘
大数乘
Time Limit:5000MS Memory Limit:32768K
Description:
给定一些大数,请计算其积。Input:
输入数据中含有一些整数对(对数≤1000),若某对整数(整数位数≤200)的值为0 0,则表示输入结束。
Output:
每对整数对应一个乘法计算结果,输出该结果,每个结果输出完后应回车。
Sample Input:
2 3 12 34 0 0
Sample Output:
6
408
注意负数和输出不能为-0
代码:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 const int maxlen=1005; 6 7 int main() 8 { 9 int i,j; 10 char s1[maxlen],s2[maxlen]; 11 int a[maxlen],b[maxlen],c[maxlen*2]; 12 while(scanf("%s%s",s1,s2)&&(strcmp(s1,"0")!=0||strcmp(s2,"0")!=0)) 13 { 14 memset(a,0,sizeof(a)); 15 memset(b,0,sizeof(b)); 16 memset(c,0,sizeof(c)); 17 int len1=strlen(s1); 18 int len2=strlen(s2); 19 for(i=len1-1,j=0;i>=0&&s1[i]!='-';i--) 20 a[j++]=s1[i]-'0'; 21 for(i=len2-1,j=0;i>=0&&s2[i]!='-';i--) 22 b[j++]=s2[i]-'0'; 23 for(i=0;i<len1;i++) 24 for(j=0;j<len2;j++) 25 c[i+j]+=a[i]*b[j]; 26 for(i=0;i<maxlen*2;i++) 27 { 28 if(c[i]>=10) 29 { 30 c[i+1]+=c[i]/10; 31 c[i]%=10; 32 } 33 } 34 for(i=maxlen*2-1;i>=0;i--) 35 if(c[i])break; 36 if(i==-1) 37 { 38 printf("0\n"); 39 continue; 40 } 41 if(s1[0]=='-'&&s2[0]!='-'||(s1[0]!='-'&&s2[0]=='-')) 42 printf("-"); 43 for(;i>=0;i--) 44 printf("%d",c[i]); 45 printf("\n"); 46 } 47 return 0; 48 }