LFYZ-OJ ID: 1008 求A/B高精度值
思路
-
小数点前的部分可以通过m/n直接计算得出
-
小数点后的20位可通过循环进行快速计算,计算方法如下:
m%=n
m*=10
- 小数点后第i位为
m/n
,回到第1步
-
第3步后,如果
m%n
为0,说明已经除净,此时可以break
,结束循环 -
按照这种方式计算20次后,最后几次的商可能为0但余数不一定为0,会出现如下情况:
1034/1033=1.00096 80542 11035 81800
- 这里最后的两颗0是不允许出现的,一种处理方法是将计算的20个值存储在一个数组内,结束后,从数组尾部向前扫描,直到遇到非0值或者扫描到i=1为止,然后再对每一个数位输出。
例程
#include<iostream>
using namespace std;
int main(){
int m, n, xs[21]; //在xs[1...20]中存储20个小数位
scanf("%d%d", &m, &n);
printf("%d/%d=%d.", m, n, m/n); //输出整数部分和小数点
for(int i=1; i<=20; i++){ //循环20次计算20个小数位
m%=n;
m*=10;
xs[i]=m/n;
}
int i=20;
while(xs[i]==0 && i>1) i--; //计算有效的小数位
for(int j=1; j<=i; j++) //输出i个有效小数位
printf("%d", xs[j]);
return 0;
}
测试数据
input: 6 5 output: 1.2
input: 6 2 output: 3.0
input: 1034 1033 output: 1.000968054211035818