FZU 2193 So Hard (有限小数转换最简分数)(想法题)

题目链接: 传送门

So Hard

Time Limit: 1000MS     Memory Limit: 65536K

题目描述

请将有限小数化为最简分数。

输入

一个整数n 表示需要转化的小数个数; 接下来n行,每行有一个有限小数。(保证小数位数不超过9位)

输出

输出有n行,每行为小数对应的最简分数

输入示例

2
0.5
0.4

输出示例

1/2
2/5

Hint

注意精度问题,数据保证不会有类似1.0的小数。

思路

将小数扩大至整数,然后求出这个整数与扩大倍数的最大公因数,除一下,得到最简分数。
具体细节看代码注释

#include<stdio.h>

int gcd(int m,int n)
{
	int tmp;
	if (m < n)
	{
		tmp = m;
		m = n;
		n = tmp;
	}
	
	if (m % n == 0)
	{
		return n;
	}
	else
	{
		return gcd(n,m%n);
	}
}

int main()
{
	int N,i;
	
	scanf("%d",&N);
	
	while (N--)
	{
		double num1,num2;
		int sum1,sum2 = 1,fac;
		
		scanf("%lf",&num1);
		
		for (i = 1;i <= 9;i++)
		{
			num1 *= 10;
			sum2 *= 10;
			num2 = num1 + 0.000001;    //由于double类型的精度问题,如“1”,double可能以“0.99999……”保存,
			                           // 所以加一个极小的小数使之能得到想要的整数 
			if (num1 - (int)num2 <= 0.000001)   //还是由于double的精度问题,可能printf输出的num1值和(int)num2)值 
			{                                   //相同 ,但是内部这两个数由于小数位的问题是不等的,判断相等方法就用二者差值是否极小 
				break;
			}
		}
		
		sum1 = (int)num2;
		
		fac = gcd(sum1,sum2);
		
		printf("%d/%d
",sum1/fac,sum2/fac);
	}
	
	return 0;
}
#include<bits/stdc++.h>
typedef  __int64 ll; 
#define eps 1e-11
using namespace std;

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}


int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        double x;
        scanf("%lf",&x);
        ll fz=(ll)((x+eps)*1000000000);
        ll fm=1000000000;
        ll tep=gcd(fz,fm);
        printf("%I64d/%I64d
",fz/tep,fm/tep);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5399930.html