高精度除法(高精除以低精)

基本原理

高精度除以低精度,模拟手工竖式除法。例如计算 12345 ÷ 6

      2 0 5 7  (商)
  ┌──────
6 │ 1 2 3 4 5
     1 2
     ---
       0 3
         0
        ---
         3 4
         3 0
         ---
           4 5
           4 2
           ---
             3  (余数)

关键步骤:

  1. 从被除数的最高位开始,依次取一位或多位,直到不小于除数。
  2. 当前被除数部分除以除数,得到商的当前位,余数作为下一次的被除数部分。
  3. 重复直到所有位处理完。

在计算机实现中,我们通常使用一个变量 remainder 来记录当前的余数(或称为“被除数部分”)。因为除数较小,我们可以用循环模拟。

代码实现

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

// 高精度除法:大数字符串 s 除以整数 b,返回商(字符串),余数通过引用返回
string divString(const string& s, int b, int& remainder) {
    string quot;
    remainder = 0;
    for (char ch : s) {               // 从左到右(高位到低位)
        int cur = remainder * 10 + (ch - '0');
        quot.push_back(cur / b + '0');
        remainder = cur % b;
    }
    // 去掉前导零,但保留一个 '0'
    size_t pos = quot.find_first_not_of('0');
    if (pos == string::npos) return "0";
    return quot.substr(pos);
}

int main() {
    string s;
    int b;
    cin >> s >> b;
    int rem;
    string q = divString(s, b, rem);
    cout << "商: " << q << "\n余数: " << rem << endl;
    return 0;
}
  • 除法string 正序存储(高位在左)最自然,代码几乎和手动计算一样。
  • 加减乘法:小端序数组更方便进位/借位。