小数转化成分数

Posted on 2011-07-18 23:06  continue_n  阅读(865)  评论(0)    收藏  举报

HDU 1717

主要的难点是 无限循环小数的转换

这里给出求无限循环小数的方法:

设  无限循环小数     x = 0.714285714285......(循环节为714285)

则1000000*x =  714285.714285714285.....(循环节为714285)

因为是无限循环小数 所以 1000000*x - x = 714285; 即  999999i*x = 714285; 即 x = 714285/999999;

所以无限循环小数 x 就可以表示为分数 714285/999999; 如果可以约分就再化简。。。

约分也很简单就是 先求分子和分母的最大公约数,然后分子分母同时除以他们的最大公约数就可以了

刚开始做题的时候WA了,但是又找不到错误,就百度了一下,看到一位同学的博客才发现:把gets()输入改成了scanf()就AC了

真的是不知道为什么,这个还要求高手解惑

以下是AC代码:

#include <stdio.h>
#include <string.h>
int fun(int a,int b)
{
    int r;
    do
    {
        r = a % b;
        a = b;
        b = r;
    }while(r);
    return a;
}
int main()
{
    int i,t,len,a,sum,yue,h,f1,f2;
    char s[20];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        len = strlen(s);
        for( i = 0 ; i < len ; i++)
        {
            if( s[i] == '(' ) {a = i;break;}
        }
        sum = 0;
        h = 1;
        f1 = 0;
        f2 = 1;
        if( i == len )
        {
           
            for( i = 2 ; i < len ; i++)
            {
                sum = sum * 10 + (s[i]-'0') ;
                h *= 10;
            }
            yue = fun(sum,h);
            printf("%d/%d\n",sum/yue,h/yue);
        }
        else
        {
            for( i = 2 ; i < a ; i++)
            {
                f1 = f1 * 10 + (s[i]-'0') ;
                f2 *= 10;
            }
            for( i = a+1 ; i < len-1 ; i++)
            {
                sum = sum * 10 + (s[i]-'0') ;
                h *= 10;
            }
            h--;
            sum += f1*h;
            h *= f2;
            yue = fun(sum,h);
            printf("%d/%d\n",sum/yue,h/yue);
        }
    }
    return 0;   
}

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3