洛谷刷题记——P1303 A*B Problem

加和除都做了,现在来做一下高精乘法。

文章目录

题目描述

https://www.luogu.com.cn/problem/P1303

整体思路

同前几次差不多,先把字符串转成数字,然后模拟乘法竖式。

代码展示

拒绝抄袭,共创和谐社会[机智]

#include <array> // std::array
#include <iostream> // std::cin, std::cout, std::endl
#include <string> // std::string, std::to_string

using namespace std;

array<int, 50010> _ans;
array<int, 50010> _n1;
array<int, 50010> _n2;

// 高精乘法函数
string mul(string, string);

int main(void)
{
    string str1, str2;
    _ans.fill(0);
    _n1.fill(0);
    _n2.fill(0);

    cin >> str1 >> str2;
    cout << mul(str1, str2) << endl;

    return 0;
}

string mul(string a, string b)
{
    int len = 0;
    string ans;

    _n1[0] = a.size();
    _n2[0] = b.size();

    for (int i = 1; i < _n1[0] + 1; i++) // 将字符串转换成数字,并倒过来储存
    {
        _n1[i] = a[_n1[0] - i] - '0';
    }
    for (int i = 1; i < _n2[0] + 1; i++) // 同上
    {
        _n2[i] = b[_n2[0] - i] - '0';
    }

    // 开乘
    for (int i = 1; i < _n1[0] + 1; i++)
    {
        for (int j = 1; j < _n2[0] + 1; j++)
        {
            _ans[i + j - 1] += _n1[i] * _n2[j]; // 模拟竖式
        }
    }

    len = _n1[0] + _n2[0];

    // 处理进位
    for (int i = 1; i < len; i++)
    {
        if (9 < _ans[i])
        {
            _ans[i + 1] += _ans[i] / 10;
            _ans[i] %= 10;
        }
    }

    // 处理0
    while (0 == _ans[len] && 1 < len)
    {
        --len;
    }

    // 转换成字符串,其实这里可以直接输出,但我们要将它模块化
    for (int i = len; i > 0; i--)
    {
        ans += to_string(_ans[i]);
    }

    return ans;
}

写在最后

又完成了一题呢\(^o^)/YES!

发表评论

滚动至顶部