#8. 高精度减法

高精度减法

给定两个正整数(不含前导 00),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1整数长度1051 \le 整数长度 \le 10^5

输入样例:

32
11

输出样例:

21

已按 OJ 可直接使用的 1.in/1.out ... 25.in/25.out 生成 25 组“超大整数减法(结果可为负、无前导 0)”测试数据,包含多组 10^5 位压力、长借位链、相等为 0、正负结果、以及去前导 0 等关键坑点。

下载测试数据(zip)

下面按 1..25 逐组说明每组主要在卡哪些常见错误做法(正确:先比较大小决定符号;做绝对值减法时逐位借位;结果要去掉前导 0,若为 0 输出单个 0):

  1. 样例 32-11:基础正确性(正结果)。
  2. 相等(结果 0):卡相等时输出 0(别输出空串/别输出很多 0)。
  3. 小负数(11-32):卡符号处理(必须输出负号)。
  4. 简单借位(1000-1):卡借位逻辑与尾部 0 处理。
  5. 超长连续借位链(1 后面很多 0 减 1):卡借位一路传递到最高位(常见 bug:只借一次/中途断)。
  6. 大数无大量借位(9876… - 1234…):卡一般性正确性与长数字运算。
  7. 长度不同且结果为负(999… - 1000…):卡比较大小(按长度/字典序),以及负号。
  8. 明显长度不同负结果(12345-123456):卡长度比较与符号。
  9. 明显长度不同正结果(123456-12345):卡对齐补 0 与借位。
  10. 结果需要去前导 0(1000-999=1):卡输出去前导 0(别输出 0001)。
  11. 交替数字,借位散布:卡“借位在多处出现”时的实现(别把借位清零/传播错)。
  12. #11 反向(负结果):卡符号 + 借位混合。
  13. 1000 位随机 a-b(可能正可能负):综合正确性(常暴露数组越界/borrow 处理)。
  14. 1000 位随机且强制 a<b(负结果):专卡“比较后交换并加负号”的逻辑。
  15. 10000 位:10^9999 - 1:长借位链 + 结果长度不变但前面会变成 999…;卡借位与去前导 0。
  16. 10000 位负结果:1 - 10^9999:卡超大负数输出(- + 大数),以及不要溢出。
  17. 100000 位全 9 - 1:只在末位借位(其实不需要长链),卡末位处理与性能。
  18. 100000 位:10^99999 - 1(最大借位链):强卡极限借位链与性能。
  19. 100000 位随机 - 随机:强卡性能与正确性(不能用内置整型)。
  20. 100000 位随机且强制负结果:强卡符号 + 大规模借位。
  21. 差值为 1(但内部 0 很多):卡只改末位时不要把中间位搞错。
  22. 结果为 1 的经典(100000-99999):卡连续借位与去前导 0。
  23. 10^5 位模式串相减(两个大串重复):卡大规模逐位减法正确性(容易在循环索引上出错)。
  24. 接近数相减,借位交错很复杂1000...001 - 999...999,卡多位连续借位与最高位处理。
  25. 长度 50000:a=1后面全0,b=a-1(全9):结果应为 1;卡比较大小(a>b)、去前导 0、以及大长度下的效率。

你继续下一题的话,我也会同样:给 zip + 每组卡点逐条说明。