高精度模板
- 1. 高精度加法
- 2. 高精度减法
- 3. 高精度乘法
- 4. 高精度除法
1. 高精度加法
- 高精度加法其实就是一个模拟过程,模拟我们正常计算。
- 但是要注意的是,我们正常将两个数进行相加的时候说从右往左进行相加的,所以这里我们的字符串也是要从右往左进行相加的。将相加后的值的个位放到一个vector容器中,并用r记录进位。
- 就是最后我们的在vector的值是倒着存放的,所以要将其反转后才是正确值。
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>//高精度加法
int main()
{string a, b;cin >> a >> b;vector<int> ret;int i = a.size() - 1, j = b.size() - 1;int r = 0;while (i >= 0 || j >= 0 || r){int sum = 0;sum += r;if (i >= 0) sum += a[i--] - '0';if (j >= 0) sum += b[j--] - '0';ret.push_back(sum % 10);r = sum / 10;}reverse(ret.begin(), ret.end());for (auto x : ret)cout << x;return 0;
}
2. 高精度减法
- 这个其实和高精度加法很相似,就是多了多了一步判断正负数,以及去除前导0的操作
- 还有就是借位操作
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>//高精度减法
void sub(string& a, string& b, vector<int>& ret)
{int i = a.size() - 1, j = b.size() - 1;int r = 0;while (i >= 0){int sum = a[i--] - '0' + r;if (j >= 0)sum -= b[j--] - '0';ret.push_back((sum + 10) % 10);if (sum < 0) r = -1;else r = 0;}//去除前导0while (ret.size() > 1 && ret.back() == 0)ret.pop_back();
}
int main()
{string a, b;cin >> a >> b;vector<int> ret;if (a >= b){sub(a, b, ret);}else{cout << "-";sub(b, a, ret);}reverse(ret.begin(), ret.end());for (auto x : ret)cout << x;cout << endl;return 0;
}
3. 高精度乘法
- 这里我们采用无进位相乘,这样可以大大减少我们的代码量。
- 同样的要注意去前导零。

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>//高精度乘法
int main()
{string a, b;cin >> a >> b;int n = a.size(), m = b.size();vector<int> ret(n + m);//1.无进位相乘reverse(a.begin(), a.end());reverse(b.begin(), b.end());for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){ret[i + j] += (a[i] - '0') * (b[j] - '0');}}//2.处理进位int r = 0;string tmp;for (auto x : ret){r += x;tmp += r % 10 + '0';r /= 10;}//3. 去除前导零while (tmp.size() > 1 && tmp.back() == '0')tmp.pop_back();reverse(tmp.begin(), tmp.end());cout << tmp; return 0;
}
4. 高精度除法
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>//高精度乘法
int main()
{string a;int b;cin >> a >> b;vector<int> ret;int num = 0;int i = 0;while (i < a.size()){num = num * 10 + a[i++] - '0';ret.push_back(num / b);num %= b;}reverse(ret.begin(), ret.end());while (ret.size() > 1 && ret.back() == 0)ret.pop_back();for (int i = ret.size() - 1; i >= 0; i--)cout << ret[i];cout << endl;cout << "余数:" << num;return 0;
}