您的位置:首页 > 其它

hdu 1717小数化分数2

2011-09-12 01:21 295 查看



小数化分数2

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 746 Accepted Submission(s): 282

Problem Description

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?

请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

Input

第一行是一个整数N,表示有多少组数据。

每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

Output

对每一个对应的小数化成最简分数后输出,占一行。

Sample Input

3

0.(4)

0.5

0.32(692307)

Sample Output

4/9

1/2

17/52

将有限循环小数化为分数,刚看到这题表示没什么思路,百度了一下后表示思路就比清晰了。

1. a=0.(3)

a*10=3+a;

a*10-a=a*(10-1)=3;

故a=3/9=1/3;

2. a=0.( 47 )

a*100=47+a;

a*100-a=a* ( 100-1 ) = 47;

故a=47/99,

3. a=0.32(56)

b=a*100 =32 + 0.(56);

c=a*10000 =3256 + 0.(56);

c-b,答案已经很明显了

a*(10000-100)=3256-32

注意到b=a*pow(10,n), n 为循环节前的小数位个数

c=a*pow (10,m ), m为n加上循环节长度

//hdu_2.1.8小数化分数

#include<iostream>
using namespace std;
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
void solve(char *s,int &a,int &b)
{
int t1=1,t2,i,k;
a=0;
for(i=2;s[i]&&s[i]!='(';++i)
{
a=a*10+s[i]-'0';
t1*=10;
}
b=a;
t2=t1;
if(s[i]!='(')
{
k=gcd(t1,a);
a=a/k;
b=t1/k;
return;
}
for(++i;s[i]!=')';++i)
{
b=b*10+s[i]-'0';
t2*=10;
}
a=b-a;
b=t2-t1;
k=gcd(a,b);
a/=k;
b/=k;
}
int main()
{
char str[15];
int a,b,t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
solve(str,a,b);
printf("%d/%d\n",a,b);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: