加和除都做了,现在来做一下高精乘法。
文章目录
题目描述
见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!
