题目二:神秘宝藏的数字密码
- 题目描述:传说中有一个神秘的宝藏,它的密码是由两个大数字相减得到的。这两个大数字可不是一般的数字,它们超级大。你需要算出这两个大数字的差值,说不定就能找到宝藏啦!不过要小心,这个差值有可能是正的,有可能是负的,也有可能是零哦。
- 输入描述:输入有两行,每行都代表一个大整数。这些整数可能会有前导0,但是不用担心,计算的时候忽略这些多余的0就好啦。
- 输出描述:输出的是两个大整数相减的结果。如果结果大于0,直接输出这个数;如果结果小于0,在数前面加上负号“-”;如果结果是0,就输出“0”。注意,输出结果不能有多余的前导0。
- C++代码实现
- 解题思路:和上一题类似,还是用字符串存储大整数。先判断两个数的大小,如果第一个数比第二个数小,交换它们并标记结果为负。然后把两个字符串调整为相同长度,逐位相减,处理借位问题。最后根据标记给结果加上正负号,并去掉前导0后输出。
- 解题步骤
- 读取数字:用
cin
读取两个大整数,存到字符串变量里。 - 比较与标记:比较两个字符串代表数字的大小,若第一个数小,交换两个字符串,并标记结果为负数。
- 数位对齐:给短的字符串前面补0,让两个字符串一样长。
- 逐位计算:从字符串末尾开始,把字符转成数字相减,不够减时借位计算。
- 结果处理:把计算结果存到新字符串,去掉前导0,根据标记添加负号。
- 代码实现
#include<bits/stdc++.h>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
bool n = false;
if (a.length() < b.length() || (a.length() == b.length() && a < b)) {
swap(a, b);
n = true;
}
while (a.length() > b.length()) {
b = "0" + b;
}
while (b.length() > a.length()) {
a = "0" + a;
}
string r = "";
int j = 0;
for (int i = a.length() - 1; i >= 0; i--) {
int x = a[i] - '0';
int y = b[i] - '0';
x -= j;
if (x < y) {
x += 10;
j = 1;
} else {
j = 0;
}
r = char(x - y + '0') + r;
}
while (r.length() > 1 && r[0] == '0') {
r.erase(0, 1);
}
if (n) {
r = "-" + r;
}
cout << r << endl;
return 0;
}
- 样例数据
11111
99999
- **样例一输出**
-88888
- **样例二输入**
44444
44444
- **样例二输出**
0
- 测试数据
0
987
- **测试一输出**
-987
- **测试二输入**
100
99
- **测试二输出**
1
- **测试三输入**
99
100
- **测试三输出**
-1
- **测试四输入**
567
567
- **测试四输出**
0
- **测试五输入**
123456789
123456799
- **测试五输出**
-10