信息学奥赛第七节 —— 高精度模板(高精度除法)

高精度除以低精度

(大数除以小数)
4567 / 23 = 198 ... 13为例,在数学上,除法运算的过程如下:
在这里插入图片描述
不难发现,除法是一个逐位试商的过程,在整个除法的过程中,需要不断地求商、求余。另外,与高精度加法、减法、乘法不同的是,在高精度除法中,不需要逆序存储输入的数据。因为在试商的时候,被除数要从最高位开始试起,所以不需要转置存储。

高精度除法模板

(高精度/大数除以低精度/小数)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>

using namespace std;
typedef long long LL;
const int N = 1E5 + 10;
LL b,x;//x代表余数
LL a[N],c[N];//c:结果数组
char s1[N];

int main()
{
    cin >> s1 >> b;
    LL la = strlen(s1);//输入数据的长度
    for (int i = 1;i <= la;i++) a[i] = s1[i - 1] - '0';//正序存储输入的数据
    
    for (int i = 1;i <= la;i++)//高精度除以单精度核心代码
    {
        c[i] = (x * 10 + a[i]) / b;
        x = (x * 10 + a[i]) % b;
    }
    
    LL lc = 1;//输出结果
    while (c[lc] == 0 && lc < la) lc ++;//删除前导0
    for (int i = lc;i <= la;i++) cout << c[i];
    return 0;
}

高精度除以低精度模板题

思考:如果题目中要求把余数一起输出,应该怎样修改代码?
x代表余数,输出x即可
高精度除以低精度模板题(输出余数)

练习1

高精度整数除法

题目描述

求a/b的结果。 已知a,b为10^8范围内的非负整数,求a/b保留前n位小数商的结果。

输入

a b n

输出

一行数字

样例输入

97 61 50

样例输出

1.59016393442622950819672131147540983606557377049180

AC代码

#include <iostream>

using namespace std;

int main()
{
    int a,b,n; cin >> a >> b >> n;
    cout << a / b << ".";//输出a / b的整数部分
    
    int tmp = a % b;//a对b求余数,保存在tmp中
    for (int i = 1;i <= n;i++)//输出a / b的小数部分
    {
        tmp *= 10;
        cout << tmp / b;
        tmp %= b;//更新tmp
    }
    return 0;
}

测试样例
输入:

1 8 3

输出:

0.125

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值