【算法基础】高精度除法

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前是C语言 + 算法学习者
✈️专栏:【C/C++】算法
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


一、算法由来

A的长度范围:[1,100000],B值的范围为[1,10000],这就要用到高精度除法

二、算法基本思想

高精度算法同样也是计算机模拟人类竖式计算,并将其转化计算机语言的过程。

现在来回忆一下,小学除法我们是如何列竖式来解决的

在这里插入图片描述

三、算法思路

  • 首先,我们用数组存高精度数字(被除数)。由于数据长过长,要采用字符串读入string
  • 其次,将其转化成数字存进vector<int>数组中。存进数组的时候一定要倒着存入。
  • 然后,就是两数相除的过程了,初始化余数t = 0,由于计算机不太“聪明”,它只能识别被除数的一位来与除数相除,t临时用来存储每一次余数的结果。t = t * 10 + A[i] ,这就能得到被除数的每一位
  • 对于答案,只需要t / b即是商(被除数 / 除数),最后可能会有余数,因此,只需要将t = t % b(被除数 % 除数即是余数)
  • 在除法运算中,计算顺序是从高位向低位开始运算,因此A的前导0是在vector的前面而不是尾部(详情见算法基本思想),因此为了方便去除前导0,我们将A翻转,这样0就位于数组尾部,可以使用pop函数删除前导0
  • 最后再逆序输出结果就是答案,输出t就是余数

四、代码模板

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> div(vector<int> &A, int b, int &t)
{
    
    vector<int> C;//存储答案
    t = 0;//初始化余数为0
    
    //除法从高位开始算起
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        t = t * 10 + A[i];//被除数的每一位
        C.push_back(t / b);//商的计算
        t %= b;//保留下一次的余数
    }
    //翻转是为了方便取出前导0
    reverse(C.begin(), C.end());
    //去除前导0
    while (C.size() > 1 && C.back() == 0) 
        C.pop_back();
    //返回答案
    return C;
}

int main()
{
    string a;//字符串读入被除数
    int b; //除数
    int t; //余数
    vector<int> A; 
    //读入
    cin >> a >> b;
    //倒序存入A中
    for (int i = a.size() - 1; i >= 0; i -- ) 
    {
        A.push_back(a[i] - '0');
    }

    vector<int> C = div(A, b, t);

    //输出商
    for (int i = C.size() - 1; i >= 0; i -- ) 
        printf("%d",C[i]);    
    
    //输出余数
    printf("\n%d\n",t);

    return 0;
}

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值