您的位置:首页 > 其它

HDU 1717 小数化分数2

2014-06-22 20:40 288 查看
小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3176 Accepted Submission(s): 1293


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


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1717

/*
1717 小数化分数2
编程之美上有公式推导
有限 x=0.a1a2a3...an ==> a1a2..an/10^n
无限 x=0.a1a2..an(b1b2..bm) ==> [(a1a2..an)(10^m-1)+(b1b2...bm) ]/(10^m-1)*10^n

3 0.(4) 0.5 0.32(692307)

*/
#include<iostream>
#include<cstring>
using namespace std;

int gys(int m,int n)//n大 m小
{
int t;//n是底 大些
while(m>0)
{
t=n%m;
n=m;
m=t;
}
return n;
}
int main()
{
int n,z1,z2,z,p,q,x,y,len,t,i,temp1,temp;
char a[14];
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
len=strlen(a);
t=0;//有无括号
p=0;x=0;//前面an的
q=0;y=0;//bn的
for(i=2;i<len;i++)
{
if(!t&&a[i]!='(')
{
p++;x=x*10;x+=a[i]-'0';
}
if(t&&a[i]!=')')
{
q++;y=y*10;y+=a[i]-'0';
}
if(a[i]=='(')
t=1;
}
if(!q)//有限循环
{
temp=1;//10^p 程序的10^p 是异或。
for(i=0;i<p;i++)
temp*=10;

z=gys(x,temp);
printf("%d/%d\n",x/z,temp/z);
}
else
{
temp=1;//10^p
for(i=0;i<p;i++)
temp*=10;

temp1=1;//10^q
for(i=0;i<q;i++)
temp1*=10;

z1=x*(temp1-1)+y;
z2=(temp1-1)*(temp);
z=gys(z1,z2);
printf("%d/%d\n",z1/z,z2/z);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: