1.思想:
原想法为:
考虑使用两层for循环,对两个正整数a、b的所有元素进行遍历。当内层循环每执行完毕一次,则有数a的所有元素与数b的某一元素完成了一次乘法运算,将此结果result_temp存放起来,在外层for循环中进行累加。
这里改进为:
仍使用两层for循环,但是内层循环,只负责保留乘数的结果,外层循环负责对高位乘数的结果左移一位(乘以10).之后统一对结果进行进位处理。
如图:
2.实现:
代码很简洁。核心功能只有20行左右。
#include<iostream>
using namespace std;
#define countof(arr) sizeof(arr)/sizeof(arr[0])
int a_multiply[10000]; // 最大允许位数为10000的乘数
int b_multiply[10000];
int result[20000]; // result值最大位数为 乘数a与乘数b 位数之和
void multiply_func(const string& a, const string& b)
{
for (int i = a.length()-1; i >=0 ; i--) // 获取数字
a_multiply[a.length() - 1-i] = a[i]-'0';
for (int i = b.length() - 1; i >= 0; i--)
b_multiply[b.length() - 1 - i] = b[i]-'0';
for (int i = 0; i < a.length(); i++)
{
for (int j = 0; j < b.length(); j++)
{
result[i + j] += a_multiply[i] * b_multiply[j];
}
}
for (int i = 0; i < a.length()+b.length(); i++) // 处理加和进位
{
if (result[i] > 9)
{
result[i + 1] += result[i] / 10;
result[i] = result[i] % 10;
}
}
// 输出 遇到第一个不为零的最高位后依次输出,若全为零则输出零
int index_none_0 = a.length() + b.length();
while (result[index_none_0] == 0)
{
index_none_0--;
}
if (index_none_0 < 0)
cout << 0;
else
{
for (int i = index_none_0; i >= 0; i--)
{
cout << result[i];
}
}
}
int main()
{
string a, b;
cin >> a >> b;
multiply_func(a, b);
system("pause");
return 0;
}
3.输出:
测试输出结果与前述博客高精度乘法一致。