2980:大整数乘法
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
求两个不超过200位的非负整数的积。
- 输入
- 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
- 输出
- 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
- 样例输入
12345678900 98765432100
- 样例输出
1219326311126352690000
- 来源
- 程序设计实习2007
- 查看
- 提交
- 统计
- 提示
- 提问
- 代码:
#include<cstdio> #include<cstring> using namespace std; const int N = 210; char num1[N],num2[N]; int ans1[N * 2]; char * strrev(char * s){ char * h = s,*t = s, ch; while(*t++){} t--; t--; while(h < t){ ch = *h; *h++ = *t; *t-- = ch; } return s; } int main(){ scanf("%s",num1); scanf("%s",num2); memset(ans1,0,sizeof(ans1)); strrev(num1); strrev(num2); int tmp; int len1 = strlen(num1),len2 = strlen(num2); for(int i = 0; i < len1; ++i){ for(int j = 0; j < len2; ++j){ ans1[i + j] += (num1[i] - '0') * (num2[j] - '0'); } } for(int i = 0; i < len1 + len2; i++){ if(ans1[i] >= 10){ ans1[i+1]+= ans1[i]/10; ans1[i] %= 10; } } int idx = len1 + len2; while(ans1[idx] == 0 && idx >= 0) idx--; if(idx < 0) putchar('0'); else { for(int i = idx; i >= 0; i--){ printf("%d",ans1[i]); } } putchar('\n'); return 0; }