hdu 1717小数化分数2

来源:互联网 发布:房地产前期大数据 编辑:程序博客网 时间:2024/04/24 16:35

小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 746 Accepted Submission(s): 282


Problem 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

将有限循环小数化为分数,刚看到这题表示没什么思路,百度了一下后表示思路就比清晰了。

1.     a=0.(3)

a*10=3+a;

a*10-a=a*(10-1)=3;

故a=3/9=1/3;


2.    a=0.( 47 )

a*100=47+a;

a*100-a=a* ( 100-1 ) = 47;

故a=47/99,


3.    a=0.32(56)

b=a*100     =32 +     0.(56);

c=a*10000  =3256 + 0.(56);

c-b,答案已经很明显了

a*(10000-100)=3256-32

注意到b=a*pow(10,n),    n 为循环节前的小数位个数

c=a*pow (10,m ),    m为n加上循环节长度


//hdu_2.1.8小数化分数#include<iostream>using namespace std;int gcd(int x,int y){    return y==0?x:gcd(y,x%y);}void solve(char *s,int &a,int &b){    int t1=1,t2,i,k;    a=0;    for(i=2;s[i]&&s[i]!='(';++i)    {        a=a*10+s[i]-'0';        t1*=10;    }    b=a;    t2=t1;    if(s[i]!='(')    {        k=gcd(t1,a);        a=a/k;        b=t1/k;        return;    }    for(++i;s[i]!=')';++i)    {        b=b*10+s[i]-'0';        t2*=10;    }    a=b-a;    b=t2-t1;    k=gcd(a,b);    a/=k;    b/=k;}int main(){    char str[15];    int a,b,t;    scanf("%d",&t);    while(t--)    {        scanf("%s",str);        solve(str,a,b);        printf("%d/%d\n",a,b);    }    return 0;}


原创粉丝点击