//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);
    }
}


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

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

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

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