高精度除以低精度
(大数除以小数)
以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