➗

高精度除法

大数 ÷ 一位数:从最高位开始,余数往下带

💡 打个比方

还是竖式草稿纸,但除法和加减乘方向相反:从最高位(最左边)开始,像老师点名分糖果。

每一步:"上一步的余数带下来" + 这一位,凑成新数再除:商 = 能分几份,余数 = 剩下的,继续往下带。

比如 100 ÷ 3:1 比 3 小 → 商 0 跳过;10 ÷ 3 → 商 3 余 1;10 ÷ 3 → 商 3 余 1。商 = 33,余 1。

高精度除法(大数 ÷ 一位数):把大数当字符串,从左到右逐位处理:cur = rem × 10 + 当前位,写下 cur / d 作商,rem = cur % d(余数带下去)。

🖼️ 大图看明白

100 ÷ 3:从最高位开始,余数带下去 商 0 3 3 被除数 1 0 0 3 ) 商 = 33,余数 = 1 验算:33 × 3 + 1 = 100 ✓ 一位一位地除(从左往右): ① 第 1 位 1:1 < 3 → 商 0,余 1 前导 0 不写进最终答案 ② 余数带下 0 → 10:10 ÷ 3 → 商 3,余 1 10 = 3×3 + 1 ③ 余数带下 0 → 10:10 ÷ 3 → 商 3,余 1 10 = 3×3 + 1 ④ 结束:商 = 33,余数 = 1 33 × 3 + 1 = 100 ✓ 数组视角:商正着存(下标 0 = 最高位) q: 0 3 3 0 1 2 去前导零:跳过 q[0]=0 → 输出 33 余数 rem = 1 单独输出 对比:加减乘从下标 0(个位)往高走;除法从最高位往低走

📏 高精度除法,只要 3 步

  1. 第 1 步:大数当字符串读入,从左到右处理(最高位在前)——和加减乘方向相反。
  2. 第 2 步:每位算 cur = rem × 10 + 当前位;写下 cur / d 作商的一位;rem = cur % d(余数带下去)。
  3. 第 3 步:商正着存(下标 0 = 最高位),输出前去前导零,最后单独输出余数 rem。
为什么要"余数 × 10 + 当前位"?单个位可能比除数小(1 < 3),单独除不够商;把余数带下来和下一位凑成 10 才能除。这和你手写竖式除法的过程一模一样。

💻 C++ 怎么写

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s; int d;
    cin >> s >> d;
    int n = s.length();
    int q[1005] = {};
    int rem = 0;
    for (int i = 0; i < n; i++) {           // 从最高位到低位
        int cur = rem * 10 + (s[i] - '0');  // 余数带下来
        q[i] = cur / d;                      // 写下商的一位
        rem = cur % d;                       // 余数继续带下去
    }
    int head = 0;
    while (head < n - 1 && q[head] == 0) head++;  // 去前导零
    for (int i = head; i < n; i++) cout << q[i];
    cout << " 余数 = " << rem;
    return 0;
}

✋ 你来试试

题目 1:手算 1000 ÷ 3:每一位商几、余几?
第 1 位 1:1 < 3 → 商 0,余 1;带下 0 → 10:商 3,余 1;带下 0 → 10:商 3,余 1;带下 0 → 10:商 3,余 1。最终商 333,余 1。验算:333×3+1 = 1000 ✓。
题目 2:为什么除法商"正着存",加减乘却"倒着存"?
计算方向不同:加减乘从个位(最低位)开始算,所以把个位存 a[0]、倒着存;除法从最高位开始算,商的一位一位按"从高到低"生成,天然正着进数组(下标 0 = 最高位)。
🎯 一句话记住:大数 ÷ 一位数:从最高位开始,cur = rem×10 + 当前位,写 cur/d、rem = cur%d;商正着存、去前导零,余数单独输出。