constint N = 1e5 + 10; int A[N], B[N], C[N]; int la, lb, lc;
boolcmp(int A[], int B[]); voidsub(int A[], int B[], int C[]);
intmain(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string a, b; cin >> a >> b; la = a.size(), lb = b.size(), lc = max(la, lb); for (int i = la - 1; ~i; i -- ) A[la - 1 - i] = a[i] - '0'; // 翻转存入 for (int i = lb - 1; ~i; i -- ) B[lb - 1 - i] = b[i] - '0'; // 翻转存入 if (!cmp(A, B)) swap(A, B), cout << '-'; // 若 A < B, 则交换 A, B, 输出负号 sub(A, B, C); for (int i = lc; ~i; i -- ) cout << C[i]; // 逆序输出 return0; }
boolcmp(int A[], int B[]){ if (la != lb) return la > lb; for (int i = la - 1; ~i; i -- ) if (A[i] != B[i]) return A[i] > B[i]; returntrue; // 避免结果为 -0 }
voidsub(int A[], int B[], int C[]){ for (int i = 0; i < lc; i ++ ){ if (A[i] < B[i]) A[i + 1] --, A[i] += 10; // 借位 C[i] = A[i] - B[i]; // 存差 } while (lc && C[lc] == 0) lc--; // 处理前导0 }
4.2 vector
#include<bits/stdc++.h> usingnamespace std;
typedef vector<int> VI; VI A, B, C;
boolcmp(VI &A, VI &B); voidsub(VI &A, VI &B, VI &C);
intmain(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string a, b; cin >> a >> b; for (int i = a.size() - 1; ~i; i -- ) A.push_back(a[i] - '0'); // 翻转存入 for (int i = b.size() - 1; ~i; i -- ) B.push_back(b[i] - '0'); // 翻转存入 if (!cmp(A, B)) swap(A, B), cout << "-"; // 若 A < B, 则交换 A, B, 输出负号 sub(A, B, C); for (int i = C.size() - 1; ~i; i -- ) cout << C[i]; // 逆序输出 return0; }
boolcmp(VI &A, VI &B){ if (A.size() != B.size()) return A.size() > B.size(); for (int i = A.size() - 1; ~i; i -- ) if (A[i] != B[i]) return A[i] > B[i]; returntrue; // 避免结果为 -0 }
voidsub(VI &A, VI &B, VI &C){ int t = 0; // t 存储借位 for (int i = 0; i < A.size(); i++){ t = A[i]; if (i < B.size()) t -= B[i]; if (t < 0) A[i + 1] --, t += 10; // 借位 C.push_back(t); // 存余 } while (C.size() > 1 && !C.back()) C.pop_back(); // 处理前导0 }