HDU 1717 小数化分数2

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;
}


你可能感兴趣的:(HDU 1717 小数化分数2)