您的位置:首页 > 其它

HDU 1717 小数化分数2

2014-07-09 14:52 323 查看
N - 小数化分数2
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status

Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?

请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。



Input

第一行是一个整数N,表示有多少组数据。

每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。



Output

对每一个对应的小数化成最简分数后输出,占一行。


Sample Input

3
0.(4)
0.5
0.32(692307)




Sample Output

4/9
1/2
17/52




题意不多说,本人数学一般,没搞出来,下面这个博客分析得很好,粘下地址:
http://blog.csdn.net/sky_fighting/article/details/8652492
下面是本人自己代码,主要是方便自己看,献丑,大家可看上面大神的:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int real,ima,t1,t2;
int gcd(int a,int b)
{
	int t;
	while(t=a%b)
	{
		a=b;
		b=t;
	}
	return b;
}
void solve()
{
    int k=1,l=1;
	if(t2==0)
    {
        while(t1--)
            k*=10;
        int ans=gcd(real,k);
        printf("%d/%d\n",real/ans,k/ans);
    }
    else
    {
        int m=ima-real;
        while(t2--)
            k*=10;
        while(t1--)
            l*=10;
        int n=k-l;
        int ans=gcd(m,n);
        printf("%d/%d\n",m/ans,n/ans);
    }
}

int main()
{
    int N;char c;
    cin>>N;
    while(N--)
    {
		scanf("%d",&real);c=getchar();
        real=0,ima=0,t1=0,t2=0;
        while((c=getchar())!='('&&c!='\n')
        {
            if(c<='9'&&c>='0')
            {
                real=real*10+c-'0';
                t1++;
            }
        }
         if(c=='\n'){solve();continue;}
         ima=real;t2=t1;
         while((c=getchar())!=')')
        {
             if(c<='9'&&c>='0')
            {
               ima=ima*10+c-'0';
                t2++;
            }
        }
		solve();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: