高精度乘法
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,我们可以将这个数字拆开,拆成一位一位的,或者是几位几位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
对于这类问题,不要指望long double这些东西了,基本数据类型不可能存的下。我们可以把这两个数当成字符串输入到数组中,然后模拟手动的竖式运算得出结果。
说白了,高精度计算就是解决long long也解决不了的问题。
具体步骤举例
- 当然也有其他写法,如在运算中直接进位
题目要求
来源: https://leetcode-cn.com/problems/multiply-strings/description/
实现代码
#include <iostream>
#include <string>
#include <cstdlib>
#include <algorithm>
#define CAPACITY 1024
using namespace std;
class Solution
{
public:
string multiply(string num1, string num2)
{
string s;
if (num1 == "0" || num2 == "0")
{
return "0";
}
size_t maxL = num1.size() + num2.size();
int n1[CAPACITY], n2[CAPACITY], sum[CAPACITY];
int L1 = num1.size(), L2 = num2.size();
//数组全部全置零
memset(n1, 0, CAPACITY);
memset(n2, 0, CAPACITY);
memset(sum, 0, CAPACITY);
//两个string倒序放入数组中
for (int i = 0; i < L1; i++)
{
n1[i] = num1[L1 - i - 1] - '0';
}
for (int i = 0; i < L2; i++)
{
n2[i] = num2[L2 - i - 1] - '0';
}
//注意理解i + j的含义
for (int i = 0; i < L1; i++)
{
for (int j = 0; j < L2; j++)
{
sum[i + j] += n1[i] * n2[j];
}
}
//将数组内每一项该进位的进位
for (int i = 0; i < num1.size() + num2.size(); i++)
{
sum[i + 1] += sum[i] / 10;
sum[i] %= 10;
}
s.reserve(num1.size() + num2.size());
for (int i = 0; i < num1.size() + num2.size(); i++)
{
s += sum[i] + '0';
}
//消除多余的0
while (s[maxL - 1] == '0')
{
s.pop_back();
maxL--;
}
reverse(s.begin(), s.end());
return s;
}
};
int main()
{/*
string num1 = "123";
string num2 = "456";
Solution s1;
cout << s1.multiply(num1, num2);
*/
Solution s;
string s1;
string s2;
while (cin >> s1 >> s2)
{
cout << s.multiply(s1, s2) << endl;
}
system("pause");
return 0;
}