题目描述

题目大意&链接
给定两个正整数,计算它们的差。
输入输出样例:
输入:
32
11
输出:
21
详情:ac_792高精度减法
解题思路
高精度减法需要注意3点。
- 由于是两个正整数相减,结果可能为负数,因此需判断两个正整数大小:
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; }
|
- 定义 t 记录相减时是否借位,若借位,则下轮置 t=1;否则置 t=0:
int t = 0; for(int i = 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:
while(c.size() > 1 && c.back() == 0) c.pop_back();
|
完整代码
#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(); 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; int t = 0; for(int i = 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() { 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'); if(cmp(A, B)) { auto c = sub(A, B); for(int i = c.size() - 1; i >= 0; i--) printf("%d", c[i]); } else { auto c = sub(B, A); printf("-"); for(int i = c.size() - 1; i >= 0; i--) printf("%d", c[i]); } return 0; }
|
时间和空间复杂度
假设 a 和 b 的长度分别为 n 和 m,则:
时间复杂度:O(n + m)
空间复杂度:O(n + m)