2980:大整数乘法

原题:http://bailian.openjudge.cn/practice/2980/

描述

求两个不超过200位的非负整数的积。

输入

有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

输出

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

12345678900
98765432100

样例输出

1219326311126352690000

解法

思路:小学数学乘法,一项一项的乘,省却了中间结果,直接加起来

坑:如果只写这一个的话,前导0以及8*0这种特殊样例

#include <iostream>
#include <cstring>
using namespace std;
int factora[200] = {};
int factorb[200] = {};
int sum[500] = {};
int cnt1, cnt2;
int mul()
{
    int* maxn;
    int* minn;
    int maxlen, minlen;
    if (cnt1 < cnt2) {
        maxn = factorb;
        minn = factora;
        maxlen = cnt2;
        minlen = cnt1;
    }
    else {
        maxn = factora;
        minn = factorb;
        maxlen = cnt1;
        minlen = cnt2;
    }
    for (int i = 0; i < minlen; i++){
        for (int j = 0; j < maxlen; j++) {
            int temp = minn[i] * maxn[j] + sum[i + j];
            sum[i + j + 1] += temp / 10;
            sum[i + j] = temp % 10;
        }
    }
    for (int j = minlen + maxlen + 2; j >= 0; j--)
        if (sum[j] != 0)
            return j;
    return 0;
}
int main()
{
    memset(sum, 0, sizeof(sum));
    cnt1 = 0;
    cnt2 = 0;
    char inputa[200];
    char inputb[200];
    cin >> inputa;
    cin >> inputb;
    cnt1 = strlen(inputa);
    cnt2 = strlen(inputb);
    for (int i = 0; i < cnt1; i++)
        factora[cnt1 - 1 - i] = inputa[i] - '0';
    for (int i = 0; i < cnt2; i++)
        factorb[cnt2 - 1 - i] = inputb[i] - '0';
    int result = mul();
    for (int j = result; j >= 0; j--)
        cout << sum[j];

    return 0;
}

 

posted @ 2021-07-04 16:27  永远是个小孩子  阅读(61)  评论(0编辑  收藏  举报