每周一算法:高精度除法之大整数除以整数

高精度除法

高精度除法是采用模拟算法对上百位甚至更多位的整数进行除法运算,其基本思想是模拟竖式除法。在比赛中能碰到的高精度除法计算一般是一个大整数除以一个不超过 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} 0a105000 1 ≤ b ≤ 1 0 9 1\le b\le 10^9 1b109

代码实现

#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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少儿编程乔老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值