高精度减法

高精度减法实现

在处理大整数运算时,直接使用内置的数据类型可能会导致溢出,因此需要使用字符串或数组来存储大整数,并逐位进行运算。本文将介绍如何使用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

输出:
1
-86419753208641975320

示例 2

输入:

1
2
98765432109876543210
12345678901234567890

输出:
1
86419753208641975320

示例 3

输入:

1
2
50000000000000000000
50000000000000000000

输出:
1
0

代码说明

输入处理:

  • 使用字符串 s1s2 分别存储输入的两个大整数。
  • 将字符串转换为倒序存储的整数数组 ab

减法实现:

  • 函数 sub 实现两个大整数的逐位减法,考虑借位情况。
  • 函数 Max 用于比较两个大整数的大小,确定是否需要输出负号。

主函数逻辑:

  • 根据 Max 函数的结果,确定是 a - b 还是 b - a
  • 输出结果时,如果需要,先输出负号,再输出结果。
作者

Xiongyuqi

发布于

2024-05-30

更新于

2024-05-30

许可协议

评论