今天我们讲一下高精度除法中最简单的一种,那就是:高精度除于低精度,求商和余数。
有了前面高精度算法的基础(参见我上一篇文章),那么我想这一题我们多少应该会有点思路。
除法可以说是高精度中最难的算法了,为什么说它最难呢?因为我们人算除法的时候也难。你想,小学的时候加减乘除中最让你头疼的是哪一个?哈哈,我想当然是除法喽。这就对了,前面也说了,高精度算法的本质是模拟人的计算,那么我们人是怎么算除法的呢?答案是——截数和试商。
截数和试商
所谓截数,就是将数字从左到右,从高位到低位依次挨个截取,截取出来的数字我们把它放到x中,让x/除数,这就是试商,然后将每次的结果存到ans数组中,如果x/除数为0,说明我们截的不够大,要继续截,直到x/除数非0为止,也就是x>=除数为止。这时,我们不能继续截数,因为x已经大于除数,如果我们继续截数,那么x/除数就会超过一位数,导致ans溢出(这种高精度算法中每个整型只能存一位数字),所以此时,我们要更新x,x=x%除数。
最后,一样的,去除前导0输出ans数组和x即可(x就是余数)。
C++代码实现如下:
//高精度除法(高精度除于低精度)
#include <iostream>
using namespace std;
const int N = 1e5 + 5;
int a[N], ans[N], b, x;//b为低精度除数,x为截数所得
int main() {
string s;
cin >> s >> b;
for (int i = 1;i <= s.size();i++)
a[i] = s[i - 1] - '0';//因为是除法,不会溢出,所以正向存储
for (int i = 1;i <= s.size();i++)
{
x = x * 10 + a[i];//截数
ans[i] = x / b;//存答案
if (x >= b)x = x % b;//如果>=b,更新x
}
int begin = 1;
while (!ans[begin])begin++;//去除前导0
for (int i = begin;i <=s.size();i++)
cout << ans[i];//输出商
cout << endl << x << endl;//输出x(x即为余数)
return 0;
}
好了,今天的分享就到这里,感谢观看!