高精度除法
高精度除法是采用模拟算法对上百位甚至更多位的整数进行除法运算,其基本思想是模拟竖式除法。在比赛中能碰到的高精度除法计算一般是一个大整数除以一个不超过 9 9 9位数的整数,其基本思想如下:
- 首先,使用数组存储大整数
- 然后,从高位到低位遍历大整数的每一位
- 将当前位与之前的余数组合得到被除数
- 如果被除数不小于除数,则进行除法运算,保留余数;
- 继续枚举下一位
- 计算完成后,还需要处理多余的前导 0 0 0。
算法思想
下面以 123 ÷ 3 123\div3 123÷3为例模拟计算过程。
首先,从高位到低位遍历大整数的每一位。设变量 r r r保存余数, r r r的初始值为位 0 0 0。
- 被除数的百位
A
2
=
1
A_2=1
A2=1,小于除数
B
B
B,因此商的百位
C
2
=
0
C_2=0
C2=0,此时余数
r
=
1
r=1
r=1
- 将被除数的十位
A
1
=
2
A_1=2
A1=2与余数
r
=
1
r=1
r=1组合得到
12
12
12,大于除数
B
=
3
B=3
B=3,因此商的十位
C
1
=
4
C_1=4
C1=4,余数
r
=
0
r=0
r=0
- 将被除数的个位
A
0
=
3
A_0=3
A0=3与余数
r
=
0
r=0
r=0组合得到
3
3
3,等于除数
B
=
3
B=3
B=3,因此商的个位
C
0
=
1
C_0=1
C0=1,余数
r
=
0
r=0
r=0
下一步,去掉多余的前导 0 0 0。最终商为 41 41 41,余数为 0 0 0。
真题演练
题目链接:洛谷P1480 A/B Problem
输入两个整数 a , b a,b a,b,输出它们的商。
输入格式
两行,第一行是被除数,第二行是除数。
输出格式
一行,商的整数部分。
样例输入
10
2
样例输出
5
提示
0 ≤ a ≤ 1 0 5000 0\le a\le 10^{5000} 0≤a≤105000, 1 ≤ b ≤ 1 0 9 1\le b\le 10^9 1≤b≤109。
代码实现
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> div(vector<int> &a, int b, long long &r) {
vector<int> c;
for(int i = a.size() - 1; i >= 0; i --) {
r = r * 10 + a[i];
c.push_back(r / b);
r = r % b;
}
reverse(c.begin(), c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main() {
string s;
long long b, r = 0;
cin >> s >> b;
vector<int> a;
for(int i = s.size() - 1; i >= 0; i --) a.push_back(s[i] - '0');
vector<int> c = div(a, b, r);
for(int i = c.size() - 1; i >= 0; i --) cout << c[i];
return 0;
}
总结
- 高精度除法是从高位到低位枚举被除数的每一位,与之前的余数组合后再进行除法运算。
- 计算完成后,记得去掉前导0。