高精度计算(三)大数除法

若我们只考虑求解相除的商。

高精除低精

过程分析

所谓高精除低精指的是被除数值特别的大,除数值的范围在int类型范围内。

在模拟开竖式的过程当中,可以发现,除法和加、减、乘不一样,他是从高位开始计算的。所以,除法是不需要进行倒置存放的。过程当中我们也能发现,每一次都是将之前计算的余数和后面的数字结合成新的数字再进行除法计算。

int x=0;//存储余数
for(int i=0;i<l;i++){
    //组成新的数字
    x=x*10+a[i];
    //除法计算
    ans[i]=x/b;
    x=x%b;
}

最后进行输出时,从前往后进行输出即可,注意下将前导0去除掉。

完整代码

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char s1[50005]={0};
    int a[50005]={0},ans[50005]={0};
    int b;
    cin>>s1>>b;
    int l=strlen(s1);

    for(int i=0;i<l;i++){
        a[i]=s1[i]-'0';
    }
    int x=0;//存储余数
    for(int i=0;i<l;i++){
        //组成新的数字
        x=x*10+a[i];
        //除法计算
        ans[i]=x/b;
        x=x%b;
    }


    //输出,去除前导0
    bool flag=false;
    for(int i=0;i<l;i++){
        if(ans[i]!=0||i==l-1){
            flag=true;
        }
        if(flag){
            cout<<ans[i];
        }
    }

    return 0;
}

拓展

若进行两个大数进行相除又该如何处理呢?之前的解题思路就不再合适了。 17 ÷ 3 = 5 ⋯ 2 17\div 3 =5 \cdots2 17÷3=52 可以理解成5个3和一个2组合成了17。若我们要求出他们的商,只需求出17最多有几个3组成。我们可以用减法来对除法进行模拟,将被除数不断地减去除数,答案称为下一轮地被除数,直到被除数小于除数位置,循环次数即我们寻找的商。

给出伪代码:

//cmp(int a[],int b[]) 比较a,b所代表数字的大小,a<b即返回-1
//bidNumMinus(int a[],int b[]) 两个大数相减,并把结果更新至a中
while(cmp(a,b)>=0){
    bigNumMinus(a,b);
    ans++;
}
cout<<ans;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值