假定A和B都是正数,假定A这个数>=B这个数。
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool cmp(vector<int> &A, vector<int> &B) { //判断是否A>=B,如果A>=B返回true,否则返回false 4 if (A.size() != B.size()) { 5 return A.size() > B.size(); 6 } 7 for (int i = A.size() - 1; i >= 0; i--) { //从高位开始比较 8 if (A[i] != B[i]) { 9 return A[i] > B[i]; 10 } 11 } 12 return true; //A=B也成立 13 } 14 vector<int> sub(vector<int> &A, vector<int> &B) { 15 vector<int> C; 16 int t = 0; 17 //已经保证了A>=B 18 for (int i = 0; i < A.size(); i++) { 19 //还是用t来表示当前这一位 20 t = A[i] - t; 21 if (i < B.size()) { 22 t -= B[i]; 23 } 24 //若t>=0,就是t 25 //若t<0,就是t+10 26 //t一定是个位数.-9 ~ 9 27 C.push_back((t + 10) % 10); 28 //t不是0就是1 29 //t=0表示没有借位 30 //t=1表示借位了 31 if (t < 0) { 32 t = 1; 33 } else { 34 t = 0; 35 } 36 } 37 //去掉前导0 38 while (C.size() > 1 && C.back() == 0) { 39 C.pop_back(); 40 } 41 return C; 42 } 43 int main() { 44 string a, b; 45 cin >> a >> b; 46 vector<int> A, B; 47 for (int i = a.length() - 1; i >= 0; i--) { 48 A.push_back(a[i] - '0'); 49 } 50 for (int i = b.length() - 1; i >= 0; i--) { 51 B.push_back(b[i] - '0'); 52 } 53 vector<int> C; 54 if (cmp(A, B)) { //如果A>=B的话,直接减。5-3 55 C = sub(A, B); 56 } else { //否则:-(3 - 5) 57 cout << "-"; 58 C = sub(B, A); 59 } 60 for (int i = C.size() - 1; i >= 0; i--) { 61 cout << C[i]; 62 } 63 return 0; 64 }
2020年9月29日更新:高精度压8位的做法
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int base = 100000000; 4 bool cmp(vector<int> &A, vector<int> &B) { 5 if (A.size() != B.size()) { 6 return A.size() > B.size(); 7 } 8 for (int i = A.size() - 1; i >= 0; i--) { 9 if (A[i] != B[i]) { 10 return A[i] > B[i]; 11 } 12 } 13 return true; 14 } 15 vector<int> sub(vector<int> &A, vector<int> &B) { 16 vector<int> C; 17 int t = 0; 18 for (int i = 0; i < A.size(); i++) { 19 t = A[i] - t; 20 if (i < B.size()) { 21 t -= B[i]; 22 } 23 C.push_back((t + base) % base); 24 if (t < 0) { 25 t = 1; 26 } else { 27 t = 0; 28 } 29 } 30 while (C.size() > 1 && C.back() == 0) { 31 C.pop_back(); 32 } 33 return C; 34 } 35 int main() { 36 string a, b; 37 cin >> a >> b; 38 vector<int> A, B, C; 39 for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) { 40 s += (a[i] - '0') * t; 41 j++; 42 t *= 10; 43 if (j == 8 || i == 0) { 44 A.push_back(s); 45 s = 0; 46 j = 0; 47 t = 1; 48 } 49 } 50 for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) { 51 s += (b[i] - '0') * t; 52 j++; 53 t *= 10; 54 if (j == 8 || i == 0) { 55 B.push_back(s); 56 s = 0; 57 j = 0; 58 t = 1; 59 } 60 } 61 if (cmp(A, B)) { 62 C = sub(A, B); 63 } else { 64 cout << "-"; 65 C = sub(B, A); 66 } 67 cout << C.back(); 68 for (int i = C.size() - 2; i >= 0; i--) { 69 printf("%08d", C[i]); 70 } 71 return 0; 72 }