高精度除法(算法题)

在这里插入图片描述
首先解释一下我们介绍的高精度乘法的情况:及为一个数是大数(如题目中的A)一个数的普通数(如题目中的B) ,我们仅仅介绍的是此种情况。
具体代码如下(有详细注释和例子):

#include<bits/stdc++.h>
using namespace std;

/*
   处理第1位4:
   t = 0 * 10 + 4 = 4
   res添加4/3=1 → [1]
   t更新为4%3=1

   处理第2位5:
   t = 1 * 10 +5=15
   res添加15/3=5 → [1,5]
   t更新为15%3=0

   处理第3位6:
   t = 0 * 10 +6=6
   res添加6/3=2 → [1,5,2]
   t更新为6%3=0
*/


vector<int> div(vector<int> v1, int v2, int &t) {
    vector<int> res;
    
    // 逐位处理被除数的每一位(从最高位开始)
    for(int i = 0; i < v1.size(); i++) {
        /* 处理第[ i+1 ]位数字的详细过程:
           当前余数 t = 前一步的余数 * 10 + 当前位数值
           例:处理第1位4时,t = 0 * 10 + 4 = 4 */
        t = t * 10 + v1[i];    // 合并前序余数和当前位
        
        // 计算当前位的商(试商结果)
        res.push_back(t / v2); // 当前商位 = 临时值 / 除数
        
        // 更新余数用于下一位计算
        t = t % v2;            // 新余数 = 临时值 % 除数
    }
    
    /* 前导零处理流程:
       1. 反转数组:将[0,5,2]变成[2,5,0]便于处理末尾零
       2. 删除末尾连续的零:变为[2,5]
       3. 再次反转恢复正确顺序:最终[5,2] */
    reverse(res.begin(), res.end());
    while(res.back() == 0 && res.size() != 1) 
        res.pop_back();
    reverse(res.begin(), res.end());
    
    return res;
}

int main() {
    string a;
    vector<int> v1;
    int b, t = 0;
    cin >> a >> b;
    
    // 将字符串转换为数字数组(正序存储)
    for(char c : a) 
        v1.push_back(c - '0');
    
    auto res = div(v1, b, t);
    
    // 输出结果
    cout << "商:";
    for(int num : res) cout << num;
    
    cout << "\n余数:" << t << endl;
    
    return 0;
}

此篇文章参考了acwing算法基础课。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值