基本原理
高精度除以低精度,模拟手工竖式除法。例如计算 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 (余数)
关键步骤:
- 从被除数的最高位开始,依次取一位或多位,直到不小于除数。
- 当前被除数部分除以除数,得到商的当前位,余数作为下一次的被除数部分。
- 重复直到所有位处理完。
在计算机实现中,我们通常使用一个变量 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正序存储(高位在左)最自然,代码几乎和手动计算一样。 - 加减乘法:小端序数组更方便进位/借位。