高精度减法实现
在处理大整数运算时,直接使用内置的数据类型可能会导致溢出,因此需要使用字符串或数组来存储大整数,并逐位进行运算。本文将介绍如何使用C++实现高精度减法。
代码实现
以下是一个实现高精度减法的完整C++代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <bits/stdc++.h>
using namespace std;
vector<int> a, b; string s1, s2; int t;
vector<int> sub(vector<int> a, vector<int> b) { vector<int> c; int t = 0; for(int i = 0; i < a.size(); ++i) { a[i] -= t; if(i < b.size()) a[i] -= b[i]; if(a[i] < 0) t = 1; else t = 0; c.push_back((a[i] + 10) % 10); } while(c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
bool Max(vector<int> a, vector<int> b) { if(a.size() < b.size()) return true; if(a.size() > b.size()) return false; for(int i = a.size() - 1; i >= 0; --i) if(a[i] > b[i]) return false; else if(a[i] < b[i]) return true; return 0; }
int main() { cin >> s1 >> s2; for(int i = s1.size() - 1; i >= 0; --i) a.push_back(s1[i] - '0'); for(int i = s2.size() - 1; i >= 0; --i) b.push_back(s2[i] - '0'); if(Max(a, b) == true) { printf("-"); auto c = sub(b, a); for(int i = c.size() - 1; i >= 0; --i) printf("%d", c[i]); } else { auto c = sub(a, b); for(int i = c.size() - 1; i >= 0; --i) printf("%d", c[i]); } return 0; }
|
示例输入输出
以下是一些示例输入和对应的输出,帮助理解代码的工作原理。
示例 1
输入:
1 2
| 12345678901234567890 98765432109876543210
|
输出:
示例 2
输入:
1 2
| 98765432109876543210 12345678901234567890
|
输出:
示例 3
输入:
1 2
| 50000000000000000000 50000000000000000000
|
输出:
代码说明
输入处理:
- 使用字符串
s1
和 s2
分别存储输入的两个大整数。
- 将字符串转换为倒序存储的整数数组
a
和 b
。
减法实现:
- 函数
sub
实现两个大整数的逐位减法,考虑借位情况。
- 函数
Max
用于比较两个大整数的大小,确定是否需要输出负号。
主函数逻辑:
- 根据
Max
函数的结果,确定是 a - b
还是 b - a
。
- 输出结果时,如果需要,先输出负号,再输出结果。