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;
}
浙公网安备 33010602011771号