您的位置:首页 > 其它

hdu 1717 小数化分数2

2011-10-05 18:53 330 查看

小数化分数2

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1113 Accepted Submission(s): 438


[align=left]Problem Description[/align]
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

[align=left]Input[/align]
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

[align=left]Output[/align]
对每一个对应的小数化成最简分数后输出,占一行。

[align=left]Sample Input[/align]

3
0.(4)
0.5
0.32(692307)

[align=left]Sample Output[/align]

4/9
1/2
17/52

思路:这题做的真蛋疼,心神不定,可能是十一快玩疯了;这题是可以做不出来的就是思路不清晰,代码很长很烦;把小数分成循环部分和非循环部分,非循环部分很容易化成分数x/10^p
(x是非循环部分的数值,p是长度如0.34121212,x=34,p=2),循环部分:y*(10^n-1)/(10^p*10^(q+n)(y代表循环数值,q代表循环节的长度,p含义不变,n是等比数列的项数
可以约去;两部分相加的的结果是((x*10^q+y)-x)/(10^(p+q)-10^p);

代码:

# include<stdio.h>
int gcd(int a,int b)
{
int temp;
while(a%b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return b;
}
int main()
{
int i,ncase,ans,p,q,t,m,n,x,y,k,l;
char ch[25];
scanf("%d",&ncase);
while(ncase--)
{
scanf("%s",ch);
x=0;
t=0;
p=0;
q=0;
k=1;l=1;
for(i=2;ch[i]!=0;i++)
{
if(t==0 && ch[i]!='(')
{
p++;
x*=10;
x+=ch[i]-'0';
}
if(t==1&& ch[i]!=')')
{
q++;
y*=10;
y+=ch[i]-'0';
}
if(ch[i]=='(') {t=1;y=x;q=p;}
}
if(q==0)
{
while(p--)
k*=10;
ans=gcd(x,k);
x/=ans;
k/=ans;
printf("%d/%d\n",x,k);
}
else
{
m=y-x;
while(p--)
k*=10;
while(q--)
l*=10;
n=l-k;
ans=gcd(m,n);
m/=ans;
n/=ans;
printf("%d/%d\n",m,n);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: