模板
//C = A - B
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> C;
int t = 0; //借位
for (int i = 0; i < A.size(); i++) {
//每轮循环开始之际,若上一轮低位向本位借位,则t = 1;否则,t = 0
t = A[i] - t;
if (i < B.size()) t = t - B[i]; //此时,t = A[i] - B[i] - t
C.push_back((t + 10) % 10); //这条语句覆盖了t >= 0和t < 0两种情况
//若t >= 0,则本位运算未向高位借位,令t = 0;否则,令t = 1
if (t >= 0) t = 0;
else t = 1;
}
//C != 0时,消去前导0
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
算法思路
1、本位差 = A[i] - B[i] - 低位向本位的借位t
2、若本位差 >= 0,t = 0;
若本位差 < 0,需要向高位借1位,t = 1
例题
(1)
问题描述:
以字符串形式输入两个大整数a,b(非负),求a - b。
题解:
#include <iostream>
#include <vector>
using namespace std;
//C = A - B
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> C;
int t = 0; //借位
for (int i = 0; i < A.size(); i++) {
//每轮循环开始之际,若上一轮低位向本位借位,则t = 1;否则,t = 0
t = A[i] - t;
if (i < B.size()) t = t - B[i]; //此时,t = A[i] - B[i] - t
C.push_back((t + 10) % 10); //这条语句覆盖了t >= 0和t < 0两种情况
//若t >= 0,则本位运算未向高位借位,令t = 0;否则,令t = 1
if (t >= 0) t = 0;
else t = 1;
}
//C != 0时,消去前导0
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
//判断A与B的大小
bool cmp(vector<int> &A, vector<int> &B) {
if (A.size() == B.size()) {
for (int i = A.size() - 1; A[i] != B[i]; i--) return A[i] - B[i];
return 1;
}
else {
return A.size() > B.size();
}
}
int main() {
//输入两个大整数,用字符串的形式表示
string a, b; //例如a='123456'
cin >> a >> b;
vector<int> A, B, C;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //A = {6, 5, 4, 3, 2, 1}
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);
cout << '-';
}
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
return 0;
}