算法提高 P1001
时间限制:1.0s 内存限制:256.0MB
当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.
输入:
62773417 12345678
输出:
774980393241726
1 #include<stdio.h> 2 #include<string.h> 3 char s1[20],s2[20]; 4 int a1[20],a2[20],result[25]; 5 int l1,l2; 6 void mul() 7 { 8 memset(result,0,sizeof(result)); 9 for(int i=0; i<l1; i++) //实现乘法 10 for(int j=0; j<l2; j++) 11 { 12 result[i+j]+=a1[i]*a2[j]; 13 } 14 for(int i=0; i<l1+l2-1; i++) //进位处理 15 { 16 result[i+1]+=result[i]/10; 17 result[i]%=10; 18 } 19 if(result[l1+l2-1]!=0)//注意判断 20 printf("%d",result[l1+l2-1]); 21 for(int i=l1+l2-2; i>=0; i--) 22 printf("%d",result[i]); 23 // printf(" "); 24 } 25 int main() 26 { 27 scanf("%s%s",s1,s2);//运用字符串读入 28 //将各个字符所代表的数按照数字存入数组中 29 memset(a1,0,sizeof(a1)); 30 l1=strlen(s1); 31 for(int i=0; i<l1; i++) 32 { 33 a1[l1-1-i]=s1[i]-'0'; 34 } 35 memset(a2,0,sizeof(a2)); 36 l2=strlen(s2); 37 for(int i=0; i<l2; i++) 38 { 39 a2[l2-1-i]=s2[i]-'0'; 40 } 41 if(((l1==1)&&(a1[0]==0))||((l2==1)&&(a2[0]==0)))//注意把至少有一个乘数为0的情况单独拿出来考虑 42 printf("0 "); 43 else 44 mul(); 45 return 0; 46 }