大数除法

简单举例

以7546除23为例。

先减去23的100倍,就是2300,可以减3次,余下646。 此时商就是300;

然后646减去23的10倍,就是230,可以减2次,余下186。此时商就是320;

然后186减去23,可以减8次,此时商就是328.

原因说明

对于大数除法来说其本质上也是大数减法的一种延续,我们除以一个数字可以采用多次减去该数,而能减去的次数便是我们所需要的商,但是一个很大的数反复减去一个比它小的数字,这样计算的效率太低了。

于是我们采用减去除数的$10^n$来进行计算,通过这样的多次减法运算,将每次减的次数乘以$10^n$便是此次过程中的商,当我们减完之后会得到多个商(每次减的次数乘以$10^n$后的结果),我们将其加起来便可以得到我们需要的商。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//需要注意哦,之前的输入函数已经将输入的数据反序了
void High_division(node a,int x,node &c,int &yu)//a 被除数 x 除数
{ //c=a/x;yu=a%x;
long long beichu; //声明被除数的大小
for(int i=a.l-1;i>=0;--i)//从a的最后一项开始
{
beichu=a.s[i]+yu*10; //每一次的被除数 比如输入 50/3 那么第一次求商的第一位也就是1之后余下来2,我们将2乘10再加上被除数下一位的数字,便是新的被除数
c.s[i]=beichu/x; //能够减去的次数
yu=beichu%x; //求每次的余数
}
c.l=a.l;
while(c.s[c.l-1]==0&&c.l>1) //去除前面的0
c.l--;
//因为数据都是以字符串的形式进行存储的在计算后前面会多出来一些0(初始化时设置的),我们的对应结果需要将其去除
}

拿上面的代码再举一个例子

50/3

我们最先将余数初始为0,之后进入到对应的循环for中,第一次beichu等于5(之前的输入函数已经将输入的数据反序了),那么能够减去的次数为1,之后余数为2,此时c.s[]的最后一位存储的便是1,我们第二次进入到循环中去,此时的beichu便变为了20(2*10+0),再经过一次除可以得到是6,此时c.s[]的倒数第二位存储的便是6,之后我们将c.s[]的长度,假设为len进行获取,第一位(下标为0)乘以$10^{len}$次方,之后每次将其len减一,后面一项乘以相应的10的次方便可以啦,最后将每次乘出来的结果进行相加便可以了。


大数除法
https://equinox-shame.github.io/2022/07/01/大数除法/
作者
梓曰
发布于
2022年7月1日
许可协议