简介
高精度计算也是常见典型例题之一,其解题思路概括来说就是按位来进行加减乘除,将大数拆解为数组来处理。现依次给出高精度加法,高精度减法,高进度乘法和高精度除法的算法模版。
1 高精度加法
vector<int> BigAdd(const vector<int>& num1, const vector<int>& num2)
{ // num1,num2倒序存数据,eg.原数据为123,num1为{3, 2, 1}
vector<int> sum;
int add = 0; // 存放进位
int maxSize = max(num1.size(), num2.size());
for (int i = 0; i < maxSize || add; i++) {
if (i < num1.size()) {
add += num1[i];
}
if (i < num2.size()) {
add += num2[i];
}
sum.push_back(add % 10);
add /= 10;
}
return sum;
}
题目: 高精度加法
2 高精度减法
vector<int> BigMinus(const vector<int>& num1, const vector<int>& num2)
{
// 倒序存数据,个位数在首位
vector<int> minus;
int m = 0;
for (int i = 0; i < num1.size(); i++) {
m = num1[i] - m;
if (i < num2.size()) {
m -= num2[i];
}
minus.push_back((m + 10) % 10); // 这一步操作有点东西
if (m < 0) {
m = 1;
} else {
m = 0;
}
}
// 去除前导0
while (minus.size() > 1 && minus.back() == 0) {
minus.pop_back();
}
return minus;
}
高精度乘法
vector<int> BigMulti(const vector<int>& num1, const vector<int>& num2)
{
vector<int> multi(num1.size() + num2.size(), 0);
for (int i = 0; i < num1.size(); i++) {
for (int j = 0; j < num2.size(); j++) {
multi[i + j] += num1[i] * num2[j];
}
}
int n = 0;
for (int i = 0; i < multi.size(); i++) {
n += multi[i];
multi[i] = n % 10;
n /= 10;
}
// 去除前导0
while (multi.size() > 1 && multi.back() == 0) {
multi.pop_back();
}
return multi;
}
题目 高精度乘法