第十九题
3-17简单循环 模拟除法 求2个正整数相除所得小数结果的小数点后的第n位数字 (5分)
题目描述
分数a/b化为小数后,小数点后第n位的数字是多少?
输入格式
三个正整数a,b,n,相邻两个数之间用单个空格隔开。a,b均小于10000000,1≤n≤10000。
输出格式
一个数字 。
这一题就开始接触 高精度运算之模拟除法
听起来玄乎,其实不然
模拟就是模仿着人怎么计算除法,机器就怎么计算除法
想想自己,是不是可以将除法计算到小数点后任意位
那我们就从人怎么计算除法开始研究
这里计算 1/7
这是用手计算的部分
亲手尝试过后
我们就会发现
我们每次计算就是求余整除补零运算
用运算符表达就是
1 / 7 = 0, 1 % 7 = 1, 余数补零
10 / 7 = 1, 10 % 7 = 3, 余数补零
30 / 7 = 4, 30 % 7 = 2, 余数补零
20 / 7 = 2, 20 % 7 = 6
这个不就是我们刚才手算得数
接下来就是用程序实现
#include<iostream>
using namespace std;
int main() {
int a, b, n, ans = 0;
cin >> a >> b >> n;
a = a % b;//先将a%b是因为题目要求的n是小数点后第n位
for(int i = 0; i < n; ++i) {
//i从零开始计数,到n - 1结束,即是进行n次计算,等价于for(int i = 1; i <= n; ++i)
a = a * 10;//补零
ans = a / b;//除法
a = a % b;//求余,为计算下一位准备
}
cout << ans;
return 0;
}
提交结果如下
好耶,又解决一题!