HDU 1717 小数化分数2

来源:互联网 发布:centos 6.x和 5.x 编辑:程序博客网 时间:2024/04/27 15:02
N - 小数化分数2
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。 
 

Input

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

Output

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

Sample Input

30.(4)0.50.32(692307)
 

Sample Output

4/91/217/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;}


0 0
原创粉丝点击