#include<bits/stdc++.h> usingnamespace std; using Big = vector<int>; // 低位在前,每个元素是一位十进制数
Big parseBig(const string& s){ Big a; for (int i = static_cast<int>(s.size()) - 1; i >= 0; --i) { if (!isdigit(static_cast<unsignedchar>(s[i]))) throwinvalid_argument("输入必须是非负十进制整数"); a.push_back(s[i] - '0'); } if (a.empty()) a.push_back(0); while (a.size() > 1 && a.back() == 0) a.pop_back(); return a; }
string toString(const Big& a){ string s; for (int i = static_cast<int>(a.size()) - 1; i >= 0; --i) s.push_back(char('0' + a[i])); return s; }
intcompareBig(const Big& a, const Big& b){ if (a.size() != b.size()) return a.size() < b.size() ? -1 : 1; for (int i = static_cast<int>(a.size()) - 1; i >= 0; --i) { if (a[i] != b[i]) return a[i] < b[i] ? -1 : 1; } return0; }
Big addBig(const Big& a, const Big& b){ Big c; int carry = 0; for (int i = 0; i < static_cast<int>(max(a.size(), b.size())) || carry; ++i) { int sum = carry; if (i < static_cast<int>(a.size())) sum += a[i]; if (i < static_cast<int>(b.size())) sum += b[i]; c.push_back(sum % 10); carry = sum / 10; } return c; }
// 前提:a >= b Big subtractBig(const Big& a, const Big& b){ if (compareBig(a, b) < 0) throwinvalid_argument("subtractBig 要求 a >= b"); Big c = a; int borrow = 0; for (int i = 0; i < static_cast<int>(c.size()); ++i) { int digit = c[i] - borrow - (i < static_cast<int>(b.size()) ? b[i] : 0); borrow = digit < 0; if (borrow) digit += 10; c[i] = digit; } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
Big multiplyBig(const Big& a, const Big& b){ Big c(a.size() + b.size() + 1, 0); for (int i = 0; i < static_cast<int>(a.size()); ++i) { for (int j = 0; j < static_cast<int>(b.size()); ++j) c[i + j] += a[i] * b[j]; } for (int i = 0; i + 1 < static_cast<int>(c.size()); ++i) { c[i + 1] += c[i] / 10; c[i] %= 10; } while (c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
// 返回 a 除以正整数 divisor 的商,余数写入 remainder Big divideBySmall(const Big& a, int divisor, int& remainder){ if (divisor <= 0) throwinvalid_argument("除数必须为正整数"); Big q(a.size(), 0); longlong rem = 0; for (int i = static_cast<int>(a.size()) - 1; i >= 0; --i) { longlong current = rem * 10 + a[i]; q[i] = static_cast<int>(current / divisor); rem = current % divisor; } while (q.size() > 1 && q.back() == 0) q.pop_back(); remainder = static_cast<int>(rem); return q; }
intmain(){ string x, y; cin >> x >> y; Big a = parseBig(x); Big b = parseBig(y);
cout << "a + b = " << toString(addBig(a, b)) << '\n'; cout << "a * b = " << toString(multiplyBig(a, b)) << '\n'; if (compareBig(a, b) >= 0) cout << "a - b = " << toString(subtractBig(a, b)) << '\n';
int remainder = 0; Big quotient = divideBySmall(a, 7, remainder); cout << "a / 7 = " << toString(quotient) << ", remainder = " << remainder << '\n'; }
3. 运算过程
加法
从低位到高位逐位相加,把上一位进位加进来。当前位写 sum % 10,进位写 sum / 10。最后可能还剩一位进位,需要追加到结果。
减法
先保证 a >= b,逐位相减;若当前位不够减,就向高位借 1(也就是当前位加 10)。运算后从最高位去掉多余的 0。
乘法
第 i 位与第 j 位的乘积,先累加到结果的第 i + j 位,再统一处理进位。两个有 n、m 位的数,朴素乘法时间复杂度为 O(nm)。
除以小整数
从高位向低位扫描,维护当前余数 rem。把新的一位接到余数后面,商的当前位为 current / divisor,新的余数为 current % divisor。
4. 用高精度求阶乘
用高精度乘以每个小整数即可:
1 2 3 4 5 6 7 8 9 10 11 12 13
Big factorial(int n){ Big result{1}; for (int i = 2; i <= n; ++i) { Big x; int value = i; while (value > 0) { x.push_back(value % 10); value /= 10; } result = multiplyBig(result, x); } return result; }