【模板】高精度加减乘除

mac2025-11-15  6

一、加

#include <cstdio> #include <vector> #include <iostream> using namespace std; vector<int> add(vector<int> &A, vector<int> &B) { if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; //表示进位 for (int i = 0; i < A.size(); i++) { 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() { string a, b; vector<int> 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'); vector<int> C = add(A, B); //输出C for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); return 0; }

二、减

#include <cstdio> #include <vector> #include <iostream> using namespace std; //A >= B 返回True bool cmp(vector<int> &A, vector<int> &B) { if (A.size() != B.size()) return A.size() > B.size(); //从高位判断 for (int i = A.size() - 1; i >= 0; i--) { if (A[i] != B[i]) return A[i] > B[i]; } return true; //相等也返回True } 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] - t; if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); if (t < 0) t = 1; else t = 0; } //清除一下多余的 0 //否则清楚多余0 while (C.size() != 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a, b; vector<int> A, B, C; 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); } else { C = sub(B, A); printf("-"); } //输出C for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); return 0; }

三、乘

#include <cstdio> #include <vector> #include <iostream> using namespace std; typedef long long ll; vector<int> mul(vector<int> &A, ll b) { vector<int> C; ll t = 0; for (int i = 0; i < A.size() || t; i++) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } return C; } int main() { string a; ll b; vector<int> A, C; cin >> a >> b; //将字符串转化为数字 for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); C = mul(A, b); //输出C for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); return 0; }

四、除

#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; // t表示余数 vector<int> div(vector<int> &A, ll b, ll &t) { vector<int> C; for (int i = A.size() - 1; i >= 0; i--) { t = t * 10 + A[i]; C.push_back(t / b); t %= b; } //由于0保存高位所以翻转一下 reverse(C.begin(), C.end()); //去除0 while (C.size() != 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a; ll b, t = 0; vector<int> A, C; cin >> a >> b; //将字符串转化为数字 for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); C = div(A, b, t); //输出C for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); printf("\n%lld", t); return 0; }
最新回复(0)