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; }
相关文章推荐
- 【循环小数性质】HDU 1717——小数化分数2
- HDU-1717 小数化分数2
- hdu 1717 小数化分数2
- hdu 1717 小数化分数2
- hdu 1717 小数化分数2(数学)
- hdu 1717 小数化分数2
- hdu 1717 小数化分数2
- HDU 1717 小数化分数2
- HDU 1717 小数化分数
- hdu 1717 小数化分数2 (循环小数转分数)
- hdu 1717 小数化分数2 (数论)
- HDU 1717 小数化分数2
- HDU 1717 小数化分数2
- HDU 1717 小数化分数2
- HDU 1717 - 小数化分数2
- HDU 1717 小数化分数2
- hdu 1717 小数化分数2
- HDU - 1717 小数化分数2
- hdu 1717 小数化分数2
- hdu 1717 小数化分数2