大整数相乘

来源:互联网 发布:链轮厚度计算软件 编辑:程序博客网 时间:2024/06/05 21:57

输入的数据有两行,分别是两个非负数,最多1000位,输出它们的乘积
示例:
输入:
213897129837128937123
43502789523572345
输出:
9305121819000846375051201723846663435


转换成10000进制,即用一个int数组,每个数组代表一位数,按10000进制计算

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define N 1010#define base 10000using 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;}
0 0