这道题要求计算两个极大整数(最多 10000 位)的减法,普通的 int/long long 存不下这么大的数字,必须用字符串存储 + 模拟手工减法来实现。
一、核心思路
1. 大数存储:用字符串 string 存储两个超大数,因为字符串可以存任意长度的数字。
2. 大小判断:先判断两个数的大小,如果被减数 < 减数,结果为负数,交换两个数再计算,最后加负号。
3. 倒序存储:把字符串数字倒着存入数组,方便从低位到高位逐位计算(手工减法也是从个位开始算)。
4. 模拟减法:逐位相减,处理借位(不够减就向前一位借 1)。
5. 去前导零:计算完后去掉结果前面多余的 0,最后倒序输出。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、逐行代码解析
1. 头文件与全局变量
2. 大小比较函数 CMP
作用:判断字符串表示的大数 a 是否 大于等于 b
✅ 示例:
* cmp("10086", "86") → 位数 5>2 → 返回 true
* cmp("86", "10086") → 返回 false
3. 主函数逻辑
(1)输入数据 + 判断正负
✅ 关键逻辑:
* 比如计算 86 - 10086,直接算会出错,所以交换成 10086 - 86,最后加负号。
(2)倒序存入数组
* 字符转数字:'8' - '0' = 8(ASCII 码运算)
* 倒序原因:数组下标从 0 开始,对应个位、十位、百位,方便借位计算。
(3)处理借位(核心步骤)
✅ 示例:
* 某一位计算后是 -6 → 加 10 变成 4,前一位减 1。
(4)去掉前导零
* 保留至少 1 位:防止结果是 0 时输出空。
(5)输出结果
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、样例执行过程(输入:10086 和 86)
1. 判断大小:10086 > 86 → flag=1,不交换
2. 倒序存储
* a=10086 → 数组:[6,8,0,0,1]
3. 逐位相减
* 第 0 位:6-6=0
* 第 1 位:8-8=0
* 其余位不变
4. 处理借位:无负数,无需借位
5. 去前导零:结果为 1 0 0 0 0
6. 输出:10000
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、关键知识点总结
1. 高精度运算核心:用字符串存数,数组模拟计算,因为普通变量存不下超大数。
2. 倒序存储:减法从低位开始,倒序后数组下标对应数位,方便计算。
3. 借位处理:当前位 < 0 时,+10 并向前一位 -1。
4. 前导零处理:必须去掉,否则输出错误(如 00123 → 123)。
5. 正负判断:被减数 < 减数时,交换两数,最后加负号。
总结
1. 高精度减法必须用字符串+数组模拟,无法直接用数字变量存储。
2. 核心步骤:比较大小 → 倒序存数 → 逐位减法 → 处理借位 → 去前导零 → 输出。
3. 借位和前导零是最容易出错的地方,一定要仔细处理。