【小学生C++ 高精度 举一反三 】1/3.奇幻数字冒险之差值计算

题目一:奇幻数字冒险之差值计算

  1. 题目描述:在一个奇幻的数字王国里,住着两个数字巨人。他们身上的数字非常大,大到我们平时用的数字根本没法和它们比。现在,国王想让你算出这两个数字巨人身上数字的差值。要注意哦,这个差值可能是正数,可能是负数,也可能是零。
  2. 输入描述:输入有两行,每行都是一个大整数。这些整数的长度可能不一样,而且它们前面可能会有一些0,不过这些0不影响数字的大小哦。
  3. 输出描述:输出一个整数,就是这两个大整数相减的结果。如果结果大于0,直接把结果写出来就行;如果结果小于0,要在结果前面加上一个负号“-”;要是结果刚好是0,那就输出“0”。记住,输出的结果不能有多余的0在前面哦。
  4. C++代码实现
    • 解题思路:用字符串来装这些大整数,因为普通的数字类型装不下这么大的数。先比较两个字符串代表的数字谁大谁小,如果第一个数比第二个数小,那就交换它们,并且记住最后结果要加负号。然后把两个字符串调整成一样长,从最后一位开始,一位一位地相减。相减的时候,如果不够减,就像平时做减法那样,找前一位借1当10。最后把结果整理一下,去掉前面多余的0,再根据之前记的正负情况,把结果输出。
    • 解题步骤
      • 输入数字:用cin把两个大整数输入到程序里,存到两个字符串变量中。
      • 比较大小并标记:比较两个字符串代表的数字大小,如果第一个数小,就交换两个字符串,同时设置一个标记,表示最后结果是负数。
      • 数位对齐:在短的字符串前面补0,让两个字符串长度一样,这样方便后面逐位相减。
      • 逐位相减:从字符串的最后一位开始,把每一位的字符变成数字,然后相减。要是不够减,就从前一位借1当10,再进行计算。
      • 整理结果:把相减得到的结果存到一个新字符串里,把这个字符串前面多余的0去掉。如果之前标记结果是负数,就在结果前面加上负号。
    • 代码实现
#include<bits/stdc++.h> // 包含了很多有用的功能,就像一个装满工具的百宝箱
using namespace std; // 使用标准命名空间,这样可以直接用里面的工具

int main() {
    string a, b; // 定义两个字符串a和b,用来装输入的大整数
    cin >> a >> b; // 从键盘输入两个大整数,分别存到a和b里
    bool f = false; // 定义一个布尔变量f,用来标记结果是不是负数,一开始假设不是负数
    // 如果a的长度小于b,或者a和b长度一样但a小于b
    if (a.length() < b.length() || (a.length() == b.length() && a < b)) {
        swap(a, b); // 交换a和b的值
        f = true; // 标记结果是负数
    }
    // 如果a比b长,就在b前面补0
    while (a.length() > b.length()) {
        b = "0" + b;
    }
    // 如果b比a长,就在a前面补0
    while (b.length() > a.length()) {
        a = "0" + a;
    }
    string res = ""; // 定义一个字符串res,用来装计算结果,一开始是空的
    int c = 0; // 定义一个变量c,用来记录借位,一开始没有借位,所以是0
    // 从后往前,一位一位地相减
    for (int i = a.length() - 1; i >= 0; i--) {
        int x = a[i] - '0'; // 把a中当前位的字符转成数字,存到x里
        int y = b[i] - '0'; // 把b中当前位的字符转成数字,存到y里
        x -= c; // 减去上一位的借位
        if (x < y) { // 如果x比y小,说明不够减
            x += 10; // 从前面一位借1当10,x就加上10
            c = 1; // 标记这一位借位了,下一位计算时要减去这个借位
        } else {
            c = 0; // 如果够减,就没有借位
        }
        res = char(x - y + '0') + res; // 把相减的结果转成字符,加到res的前面
    }
    // 如果res长度大于1,并且第一个字符是0,就去掉这个0
    while (res.length() > 1 && res[0] == '0') {
        res.erase(0, 1);
    }
    // 如果之前标记结果是负数
    if (f) {
        res = "-" + res; // 在结果前面加上负号
    }
    cout << res << endl; // 把结果输出到屏幕上
    return 0;
}
  1. 样例数据
    • 样例一输入
12345
98765
- **样例一输出**
-86420
- **样例二输入**
50000
50000
- **样例二输出**
0
  1. 测试数据
    • 测试一输入
0
1234
- **测试一输出**
-1234
- **测试二输入**
1000
999
- **测试二输出**
1
- **测试三输入**
999
1000
- **测试三输出**
-1
- **测试四输入**
123
123
- **测试四输出**
0
- **测试五输入**
1234567890
1234567899
- **测试五输出**
-9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

信奥大黄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值