LFYZ-OJ ID: 1008 求A/B高精度值

思路

  • 小数点前的部分可以通过m/n直接计算得出

  • 小数点后的20位可通过循环进行快速计算,计算方法如下:

    1. m%=n
    2. m*=10
    3. 小数点后第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
posted @ 2017-04-27 18:20  LFYZOI题解  阅读(523)  评论(0编辑  收藏  举报