poj-1930

//144K  0MS C++
#include <cstdio>
#include <cstring>
#include <cmath>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else if (a > b) {
        return gcd(b, a%b);
    } else {
        return gcd(a, b%a);
    }
}

// int gcd(int a,int b)  
// {  
//     if(!a)  
//         return b;  
//     return gcd(b%a,a);  
// }  

char str[100];

int main() {
    while(scanf("%s", str) != EOF) {
        if(!strcmp(str, "0")) {
            return 0;
        }

        int num,k,all,a,b,i,j,mina,minb,l;
        mina = minb = 1000000000;

        // get the number before ......
        for(i=2, all=0, l=0; str[i]!='.'; i++)  
        {  
            all = all*10 + str[i]-'0';  
            l++;  
        }

        for(num=all,k=1,i=1;i<=l;i++)  
        {  
            // printf("K\n");
            num/=10;  
            k*=10;  
            a=all-num;  
            b=(int)pow(10.0,l-i)*(k-1);  
            j=gcd(b,a);  
            if(b/j<minb)  
            {  
                mina=a/j;   minb=b/j;  
            }  
        }

        printf("%d/%d\n", mina, minb);
    }
}


http://blog.youkuaiyun.com/xinghongduo/article/details/6231107


比较trick的题,原理很简单, 要记住题目要求遍历所有可能的无限循环, 从中找到最小的除数:

比如 0.34.... , 无限循环的部分可能是 34 也可能是 3. 

要将这些情况都考虑一下,找到除数最小的,

记得求gcd(妈的 一开始还写错了。。。 太水了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值