高精度除法

发表于 2026-02-26 17:09 更新于 2026-02-26 17:11 245 字 2 min read

cpp解决高精度除法问题

高精度除法

有高精度数 A 和除数 b

我们从 A 的第一位开始,C[0] = A[0] / b,r = A[0] % b

然后第二位的时候,我们需要把前面的余数乘 10 在加上 A[1],得到这一步的被除数,然后 C[1] = 被除数 / b ,新的 r = 被除数%b

同理持续运行到 A[n-1]结束。最后记得去除前导 0,这里去除前导 0 有两个方法,分别对应两种大数储存方式:

  • 大数高位存在容器高位(后面):这种去除前导 0 很简单,直接 while 检查 back 是不是 0,是就 pop_back

  • 大数高位存在容器低位 (前面): 检查 front 检查是不是 0,是就 erase 开头

void div(vector<int> &A,int b,vector<int> &C,int &r)
{
    for(int i=0;i<A.size();i++)
    {
        C.push_back((r*10 + A[i]) / b);  // 处理第一位的时候r是0所以乘10没影响
        r = (r*10 + A[i]) % b;
    }
    while(C.size() > 1 && C.front() == 0 ) C.erase(C.begin());
    return;
}