由于 c++ 没有类似于 java 和 python 等语言的高精度库,所以如果我们要在 c++ 中存放高精度数据,需要我们自己手写一个高精度的算法。我们可以使用 vector 库来倒序存放一个数字。即低位在前,高位在后。
低精度转高精度
作用:输出转换以后的高精度 限制:输入的数是正数 返回值:转换以后的高精度
1 2 3 4 5 6 7 8
vector<int> convert(int a){ vector<int> c; while (a) { c.push_back(a % 10); a /= 10; } return c; }
字符串转高精度
作用:输出转换以后的高精度 限制:输入的数是正数 返回值:转换以后的高精度
1 2 3 4 5 6 7
vector<int> convert(string a){ vector<int> c; for (int i = a.size() - 1; i >= 0; i --) { c.push_back(a[i] - '0'); } return c; }
输出一个高精度
作用:输出高精度 限制:输出的数是正数 返回值:void
1 2 3 4 5 6
voidprint(vector<int> c){ for (int i = c.size() - 1; i >= 0; i --) { cout << c[i]; } cout << endl; }
高精度和高精度的对比
作用:对比两个高精度 限制:a 和 b 都是正数 返回值:如果 a 比 b 大,那么返回 1,如果 a 比 b 小返回-1,如果 a 和 b 一样大,则返回 0。
1 2 3 4 5 6 7 8 9
intcompare(vector<int> & a, vector<int> & b){ if (a.size() < b.size()) return-1; if (a.size() > b.size()) return1; for (int i = a.size() - 1; i >= 0; i --) { if (a[i] > b[i]) return1; elseif (a[i] < b[i]) return-1; } return0; }
高精度加高精度
作用:将两个高精度相加 限制:两个数都是正数 返回值:相加以后的高精度
1 2 3 4 5 6 7 8 9 10 11
vector<int> add(vector<int> & a, vector<int> & b){ vector<int> c; for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i ++) { if (i < a.size()) t += a[i]; if (i < b.size()) t += b[i]; c.push_back(t % 10); t /= 10; } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
高精度减高精度
作用:将两个高精度相减 限制:两个数都是正数,且 a > b 返回值:相减以后的值
1 2 3 4 5 6 7 8 9 10 11 12
vector<int> sub(vector<int> &a ,vector<int> &b){ vector<int> c; for (int i = 0, t = 0; i < a.size(); i ++) { t += a[i]; if (i < b.size()) t -= b[i]; c.push_back((t + 10) % 10); if (t < 0) t = -1; else t = 0; } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
高精度乘高精度
作用:将两个高精度相乘 限制:两个数都是正数 返回值:两个数相乘以后的高精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
vector<int> mul(vector<int> &a, vector<int> &b){ vector<int> c(a.size() + b.size()); for (int i = 0; i < a.size(); i ++) { for (int j = 0; j < b.size(); j ++) { c[i + j] += a[i] * b[j]; } } for (int i = 0, t = 0; i < c.size() || t; i ++) { t += c[i]; c[i] = t % 10; t /= 10; } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
高精度加低精度
作用:将一个高精度和一个低精度相加 限制:两个数都是正数 返回值:两个数相加以后的高精度
1 2 3 4 5 6 7 8 9
vector<int> add(vector<int>& a, int b){ vector<int> c; for (int i = 0, t = b; i < a.size() || t; i ++) { if (i < a.size()) t += a[i]; c.push_back(t % 10); t /= 10; } return c; }
高精度乘低精度
作用:将一个高精度和一个低精度相乘 限制:两个数都是正数 返回值:两个数相乘以后的高精度
1 2 3 4 5 6 7 8 9
vector<int> mul(vector<int> &a, int b){ vector<int> c; for (int i = 0, t = 0; i < a.size() || t; i ++) { if (i < a.size()) t += a[i] * b; c.push_back(t % 10); t /= 10; } return c; }