高精度减法需先比较绝对值大小决定是否交换并标记符号,再从低位模拟手算借位:当前位不够减则向高位借1(+10),高位为0时循环向前借至非零位,最后清理前导零并还原符号。

substr 和 append 本身不能做减法,别被函数名误导
很多人看到 substr(取子串)、append(拼接)就以为能“模拟减法”,其实这两个函数完全不处理数值逻辑——它们只操作字符串。真要模拟减法(比如大整数减法),你得自己实现借位、逐位计算、符号判断等逻辑,substr 和 append 最多只能当辅助工具,用来切数字串或拼结果。
用 substr 提取数字片段时,注意索引和长度的边界
比如字符串 "12345" 表示一个大数,想从末尾取两位做低位运算:s.substr(s.size() - 2, 2) 是对的;但写成 s.substr(s.size() - 2) 也行(省略长度表示“到末尾”),可一旦 s 长度不足 2,就会抛 std::out_of_range 异常。
- 永远先检查
s.size() >= n再调substr(s.size() - n, n) -
substr(pos, len)中len超过剩余字符数时,会自动截断,不报错,但结果可能不是你想要的 - 别用
substr(0, pos)当“高位部分”——如果pos是从右往左算的位数,得写成substr(0, s.size() - n)
append 只负责拼,不负责格式和符号,负号得手动处理
减法结果可能是负数,但 append 不管这个。比如 "123" 减 "456",你算出绝对值是 "333",还得自己判断要不要在前面加 "-",再用 append 或直接构造:
string res = "";
if (is_negative) res = "-" + res; // 不要用 res.append("-"),顺序反了
else res = res; // 或直接赋值-
append总是追加到末尾,拼负号必须前置,所以通常用operator+或insert - 多次
append小字符串(如每位结果)比一次拼接更慢,但可读性高;若性能敏感,建议先存 vector,最后用 string 构造 - 别在循环里反复
append到同一个 string——它可能触发多次内存重分配;预留空间:res.reserve(max_len)
真正关键的是怎么逐位模拟减法逻辑
核心不是 substr/append,而是对齐、借位、字符转数字、结果转字符这一整套。例如:
立即学习“C++免费学习笔记(深入)”;
- 把两个字符串右对齐(短的前面补
'0'),用substr拆不出什么,但可以用下标访问:a[i] - '0' - 从末尾开始遍历,维护
carry = -1表示借位,每次计算:digit = (a[i] - '0') - (b[i] - '0') - carry - 若
digit ,则 <code>digit += 10,并设carry = 1;否则carry = 0 - 每位结果用
res.insert(res.begin(), '0' + digit)或先 push_back 再 reverse
这时候 append 可用于收集低位结果(res.append(1, '0' + digit)),但之后必须 reverse,否则顺序颠倒。
最易忽略的点:前导零。算完 "100" - "99" 得到 "001",得用 substr 找第一个非零位:res.find_first_not_of('0'),再切;如果全是零,得返回 "0"。这个逻辑不在 substr 或 append 里,得你自己写。


















