高精度
高精度加法
1、用途
计算两个大非负整数相加
2、原理
模拟竖式运算
3、复杂度
(O(n))
4、模板
vector <int> add(vector <int> &A, vector <int> &B)
{
vector <int> temp; int t = 0;
for (int i = 0; i < A.size() || i < B.size(); ++i)
{
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
temp.push_back(t % 10);
t /= 10;
}
if (t) temp.push_back(t);
return temp;
}
5、备注
①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。
高精度减法
1、用途
计算两个大非负整数相减
2、原理
模拟竖式运算
3、复杂度
(O(n))
4、模板
bool cmp(string &a, string &b)
{
if (a.length() != b.length()) return a.length() < b.length();
else
{
for (int i = 0; i < a.length(); ++i)
if (a[i] != b[i]) return a[i] < b[i];
}
return 0;
}
vector <int> sub(vector <int> &A, vector <int> &B)
{
vector <int> temp; int t = 0;
for (int i = 0; i < A.size(); ++i)
{
t = A[i] - t;
if (i < B.size()) t -= B[i];
temp.push_back((t + 10) % 10);
if (t < 0) t = 1; else t = 0;
}
while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
//去前导0 注意要留至少一位数
return temp;
}
5、备注
①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。
②在使用时要先对输入的(a, b)进行大小判断,若(a<b)要先输出负号。
高精度乘法
1、用途
计算大非负整数乘小非负整数
2、原理
模拟竖式运算
3、复杂度
(O(n))
4、模板
vector <int> mul(vector <int> &A, int b)
{
vector <int> temp; int t = 0;
for (int i = 0; i < A.size() || t; ++i)
{
if (i < A.size()) t += A[i] * b;
temp.push_back(t % 10);
t /= 10;
}
while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
return temp;
}
5、备注
①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。
高精度除法
1、用途
计算大非负整数除小正整数
2、原理
模拟竖式运算
3、复杂度
(O(n))
4、模板
vector <int> div(vector <int> &A, int b, int &r)
{
vector <int> temp;
for (int i = A.size() - 1; i >= 0; --i)
{
r = r * 10 + A[i];
temp.push_back(r / b);
r %= b;
}
reverse(temp.begin(), temp.end());
while (temp.size() > 1 && temp.back() == 0) temp.pop_back();
return temp;
}
5、备注
①数字的存储方式和一般的书写方式不同,低位在前,高位在后。读入和输出时都要把目标对象反转。
②高精度除法顺序和加减乘不同,是从高位往低位运算的。因此答案存储的时候是正序。为与之前的模板保持一致,需要把答案(reverse)再返回。
③写代码时循环中不需要特判前导0,最后翻转之后可以直接去除。
④观察到余数(r<b<maxint),所以可以直接用(int)存储。由于要返回答案和余数,所以把余数用引用传入函数。