//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(妈的 一开始还写错了。。。 太水了)
标签:b%,return,gcd,int,1930,poj,str,include From: https://blog.51cto.com/u_9420214/6332968