大整数相乘

输入的数据有两行,分别是两个非负数,最多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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值