HDUACM 1717 小数化分数2

第一次看到这个题目,完全没有思路,突感数学知识的欠缺。Google之后,知道了这题的解法。

如果该小数number不是循环小数,这很好办。将number化成整数,再除以扩大的倍数,化简即可。

若number是循环小数,其实也简单。如果数学知识好的应该知道,把一个循环小数化成整数是有规律的。

比如 0.(5) = 5 / 9; (括号里的是循环的部分)

0.(123) = 123 / 999;

0.00(987) = 987 / 99900;

0.12300(345) = 123 / 1000 + 345 / 99900000;

以上数学知识来源于http://www.worldlingo.com/ma/enwiki/zh_cn/Fraction_(mathematics)

到这儿,规律都清楚了吧。那好,下面是我的AC代码。我相信,肯定有其他牛人有更好的解法或精炼的代码,希望也能与我分享。

#include "stdio.h"
#include "string.h"
#include "math.h"

long
gcd(long a,long b)
{

    if
(a % b == 0)
        return
b;
    else

    {

        return
gcd(b,a % b);
    }
}


int
main()
{

    int
n,i,j;
    char
value[14];
    int
mark,k;
    long
v1,v2,temp,v3,temp1;
    scanf("%d",&n);
    while
(n --)
    {

        scanf("%s",value);
        v2 = 0;
        v1 = 0;
        k = 0;
        mark = 0;   
        for
(i = 2; value[i] != '\0'; i ++)
        {

            if
(value[i] == '(')
            {

                i ++;
                while
(value[i] != ')')
                {

                    v1 = v1 * 10 + value[i] - '0';
                    mark ++;
                    i ++;
                }
            }

            else

            {

                v2 = v2 * 10 + value[i] - '0';
                k ++;
            }
        }

        if
(v1 == 0)
        {

            temp1 = pow(10.0,k);
            temp = gcd(v2,temp1);
            if
(temp != v2 * temp1)
            {

                v2 = v2 / temp;
                temp1 = temp1 / temp;
            }

            printf("%ld/",v2);
            printf("%ld\n",temp1);
        }

        else

        {

            v3 = 0;
            for
(j = 0; j < mark; j ++)
            {

                v3 = v3 * 10 + 9;
            }

            if
(v2 != 0)
            {

                v2 *= v3;
            }

            j = i - mark - 4;
            while
(j --)
            {

                v3 *= 10;
            }

            temp = gcd(v1 + v2,v3);
            if
(temp != (v2 + v1) * v3)
            {

                v3 = v3 / temp;
                v1 = (v1 + v2) / temp;
            }

            printf("%ld/",v1);
            printf("%ld\n",v3);
        }
    }
}

posted @ 2011-06-08 12:20  ProgrammingEveryday  阅读(235)  评论(6)    收藏  举报