【小学生C++ 高精度 举一反三 】2/3.神秘宝藏的数字密码

题目二:神秘宝藏的数字密码

  1. 题目描述:传说中有一个神秘的宝藏,它的密码是由两个大数字相减得到的。这两个大数字可不是一般的数字,它们超级大。你需要算出这两个大数字的差值,说不定就能找到宝藏啦!不过要小心,这个差值有可能是正的,有可能是负的,也有可能是零哦。
  2. 输入描述:输入有两行,每行都代表一个大整数。这些整数可能会有前导0,但是不用担心,计算的时候忽略这些多余的0就好啦。
  3. 输出描述:输出的是两个大整数相减的结果。如果结果大于0,直接输出这个数;如果结果小于0,在数前面加上负号“-”;如果结果是0,就输出“0”。注意,输出结果不能有多余的前导0。
  4. C++代码实现
    • 解题思路:和上一题类似,还是用字符串存储大整数。先判断两个数的大小,如果第一个数比第二个数小,交换它们并标记结果为负。然后把两个字符串调整为相同长度,逐位相减,处理借位问题。最后根据标记给结果加上正负号,并去掉前导0后输出。
    • 解题步骤
      • 读取数字:用cin读取两个大整数,存到字符串变量里。
      • 比较与标记:比较两个字符串代表数字的大小,若第一个数小,交换两个字符串,并标记结果为负数。
      • 数位对齐:给短的字符串前面补0,让两个字符串一样长。
      • 逐位计算:从字符串末尾开始,把字符转成数字相减,不够减时借位计算。
      • 结果处理:把计算结果存到新字符串,去掉前导0,根据标记添加负号。
    • 代码实现
#include<bits/stdc++.h> // 包含各种有用的函数和类型
using namespace std; // 使用标准命名空间

int main() {
    string a, b; // 定义字符串a和b存储输入的大整数
    cin >> a >> b; // 从输入获取两个大整数
    bool n = false; // 标记结果是否为负,初始为否
    // 比较a和b的大小
    if (a.length() < b.length() || (a.length() == b.length() && a < b)) {
        swap(a, b); // 交换a和b
        n = true; // 标记结果为负
    }
    // 使a和b长度相同
    while (a.length() > b.length()) {
        b = "0" + b;
    }
    while (b.length() > a.length()) {
        a = "0" + a;
    }
    string r = ""; // 存储计算结果的字符串,初始为空
    int j = 0; // 借位变量,初始为0
    // 逐位相减
    for (int i = a.length() - 1; i >= 0; i--) {
        int x = a[i] - '0'; // 取a当前位数字
        int y = b[i] - '0'; // 取b当前位数字
        x -= j; // 减去借位
        if (x < y) { // 不够减
            x += 10; // 借1当10
            j = 1; // 标记借位
        } else {
            j = 0; // 无借位
        }
        r = char(x - y + '0') + r; // 存储结果
    }
    // 去除前导0
    while (r.length() > 1 && r[0] == '0') {
        r.erase(0, 1);
    }
    // 根据标记添加负号
    if (n) {
        r = "-" + r;
    }
    cout << r << endl; // 输出结果
    return 0;
}
  1. 样例数据
    • 样例一输入
11111
99999
- **样例一输出**
-88888
- **样例二输入**
44444
44444
- **样例二输出**
0
  1. 测试数据
    • 测试一输入
0
987
- **测试一输出**
-987
- **测试二输入**
100
99
- **测试二输出**
1
- **测试三输入**
99
100
- **测试三输出**
-1
- **测试四输入**
567
567
- **测试四输出**
0
- **测试五输入**
123456789
123456799
- **测试五输出**
-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信奥大黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值