本文主要是介绍【高精度】高精加法/减法/乘法/除法模板合集+解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
高精度加减乘除
注意:因为高精度的加法/减法/乘法都是反向读取,处理最低位,所以为了保持统一,高精度的除法也采用了反向的输入模式。
(付费 ) 练习链接:
- 高精度加法
- 高精度减法
- 高精度乘法
- 高精度除法
前言:由于高精度本质就是小学的四则运算,所以本文主要以展示模板为主要目的。
高精度加法
#include <iostream>
#include <vector>
using namespace std;vector<int> add(vector<int>& A, vector<int>& B) {vector<int> C;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];C.push_back(t % 10);t /= 10;}if (t) C.push_back(1);return C;
}int main() {vector<int> A, B, C; string a, b;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) {A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--) {B.push_back(b[i] - '0');}C = add(A, B);for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}return 0;
}
注意点:
- 反向读取,便于从最低位开始运算
- 使用
t
保存每一次的进位 - 最后补上最高位
高精度减法
#include <iostream>
#include <vector>using namespace std;bool cmp(vector<int>& A, vector<int>& B) {if (A.size() != B.size()) {return A.size() > B.size();} else {for (int i = A.size() - 1; i >= 0; i--) {if (A[i] != B[i]) return A[i] > B[i];}}return true;
}vector<int> sub(vector<int>& A, vector<int>& B) {vector<int> C;// 必须保证A > B才可以使用本模板for (int i = 0, t = 0; i < A.size(); i ++) {t = A[i] - t;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;
}int main() {vector<int> A, B, C;string a, b;cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) {A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--) {B.push_back(b[i] - '0');}if (cmp(A, B)) {C = sub(A, B);for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}} else {C = sub(B, A);cout << '-';for (int i = C.size() - 1; i >= 0; i--) {cout << C[i];}}
}
注意点:
- 同样是反向读取,从最低开始运算
- 使用
t
保存借位,每次进位扣除借位 - 最后去掉所有的前导零
- 必须保证A > B,如果是A < B那么问题其实可以转换为**- (B - A)**
高精度乘法
#include <iostream>
#include <vector>using namespace std;int b;
string a;
vector<int> A;vector<int> multi(vector<int>& A, int b) {int t = 0;vector<int> C;for (int i = 0; i < A.size() || t; i ++) {if (i < A.size()) t += A[i] * b;C.push_back(t % 10);t /= 10;}while (C.back() == 0 && C.size() > 1) C.pop_back();return C;
}int main() {cin >> a >> b;for (int i = a.size() - 1; i >= 0; i --) {A.push_back(a[i] - '0');}auto C = multi(A, b);for (int i = C.size() - 1; i >= 0; i --) cout << C[i];return 0;
}
注意点:
- 使用
t
存储进位 - 最后同样不要忘记去掉前导零
- 这里的循环结束条件中的
|| t
,其实和高精度加法最后补上最高位本质上是一个功能,只是实现方式有略微差别s
高精度除法
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;string a;
int b, r;
vector<int> A;vector<int> div(vector<int> A, int b, int& r) {vector<int> C;for (int i = A.size() - 1; i >= 0; i --) {r= r * 10 + A[i];C.push_back(r / b);r %= b;}// 第一种写法:// reverse(C.begin(), C.end());// while (C.size() > 1 && C.back() == 0) C.pop_back();// reverse(C.begin(), C.end());// 我的写法:while (C.size() > 1 && C[0] == 0) C.erase(C.begin());return C;
}int main() {cin >> a >> b;for (int i = a.size() - 1; i >= 0; i --) {A.push_back(a[i] - '0');}auto C = div(A, b, r);for (int i = 0; i < C.size(); i ++ ) {cout << C[i];}cout << endl << r;return 0;
}
注意点:
- 为了保持输入结构的一致性(协同加减乘),也使用反向读取(其实可以不用),所以在函数中再次反向读取从而从最高位开始计算
- 最后不要忘记去掉前导零
这篇关于【高精度】高精加法/减法/乘法/除法模板合集+解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!