输入的数据有两行,分别是两个非负数,最多1000位,输出它们的乘积
示例:
输入:
213897129837128937123
43502789523572345
输出:
9305121819000846375051201723846663435
转换成10000进制,即用一个int数组,每个数组代表一位数,按10000进制计算
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define N 1010
#define base 10000
using namespace std;
int a[500], b[500], ans[50002];
char s1[1010], s2[1010];
int main()
{
int i, j, l1, l2, t, carry, mul;
scanf("%s%s", s1, s2);
l1 = strlen(s1);
l2 = strlen(s2);
for (j = 0, i = l1-1; i >= 3; i -= 4, j++){
t = s1[i]-'0'+10*(s1[i-1]-'0')+100*(s1[i-2]-'0')+1000*(s1[i-3]-'0');
a[j] = t;
}
if (i < 3){
t = 0;
mul = 1;
for (; i >= 0; i--){
t += (s1[i] - '0')*mul;
mul *= 10;
}
a[j++] = t;
}//字符串转换成int数组
l1 = j;
for (j = 0, i = l2-1; i >= 3; i -= 4, j++){
t = s2[i]-'0'+10*(s2[i-1]-'0')+100*(s2[i-2]-'0')+1000*(s2[i-3]-'0');
b[j] = t;
}
if (i < 3){
t = 0;
mul = 1;
for (; i >= 0; i--){
t += (s2[i] - '0')*mul;
mul *= 10;
}
b[j++] = t;
}
l2 = j;
for (j = l1; j >= 0; j--){
if (a[j]) break;
}
memset(ans, 0, sizeof(ans));
carry = 0;//进位
for (i = 0; i < l1; i++){
carry = 0;
for (j = 0; j < l2; j++){
ans[i+j] += a[i]*b[j]+carry;
carry = ans[i+j]/base;
ans[i+j] %= base;
}
ans[i+j] += carry;
}
for (j = 50000; j >= 0; j--){
if (ans[j]) break;
}
printf("%d", ans[j]);
for (j--; j >= 0; j--){
printf("%04d", ans[j]);//输出的时候需要注意,不足四位的应该补0
}
return 0;
}