[关闭]
@xunuo 2016-11-19T16:57:03.000000Z 字数 996 阅读 949

A * B Problem (Big integer version) 【高精度】

高精度

Time Limit: 1000 MS Memory Limit: 65536 KB

链接:https://www.oj.swust.edu.cn/problem/show/1019


Description

计算2个不超过40位的正整数的积.

Input

输入为2行,每一行代表一个数.

Output

输出一行,为2个数的乘积.

Sample Input

11111111111111
1111111111

Sample Output

12345679011110987654321

Hint

用数组!

完整代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int a[45],b[45],sum[90];
  7. char s1[45],s2[45];
  8. int main()
  9. {
  10. while(scanf("%s%s",s1,s2)!=EOF)
  11. {
  12. memset(a,0,sizeof(a));
  13. memset(b,0,sizeof(b));
  14. memset(sum,0,sizeof(sum));
  15. int l1=strlen(s1);
  16. int l2=strlen(s2);
  17. for(int i=0;i<l1;i++)
  18. a[i]=s1[l1-1-i]-'0';//将s1里的数倒序存入a数组中
  19. for(int i=0;i<l2;i++)
  20. b[i]=s2[l2-1-i]-'0';//将s2里的数倒序存入a数组中
  21. for(int i=0;i<l1;i++)
  22. for(int j=0;j<l2;j++)
  23. {
  24. sum[i+j]+=a[i]*b[j];//乘法:sum[i+j]=a[i]*b[j]
  25. if(sum[i+j]>=10)//当有进位时
  26. {
  27. sum[i+j+1]+=(sum[i+j])/10;//它的下一位为本位除以10
  28. sum[i+j]=sum[i+j]%10;//本位除以10的余数就为本位
  29. }
  30. }
  31. int l=l1+l2;//乘法的位数最大不会炒锅两个因数之和
  32. for(int i=l;i>0;i--)//去前导零
  33. {
  34. if(sum[i]==0)
  35. l--;
  36. else
  37. break;
  38. }
  39. for(int i=l;i>=0;i--)//输出结果
  40. printf("%d",sum[i]);
  41. printf("\n");
  42. }
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注