小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3176 Accepted Submission(s): 1293
Total Submission(s): 3176 Accepted Submission(s): 1293
Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/2 17/52
/* 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; }