Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3 0.(4) 0.5 0.32(692307)
Sample Output
4/9 1/217/52
x=0.34(59)
即100x=34.(59) (1)
10000x=3459.(59) (2)
(2)-(1),得9900x=3459-34, => x=(3459-34)/9900,记要要化简!
2.纯循环小数,如0.(4),表示0.444......,对于纯循环小数:
分母:循环节由几位数字组成就有多少个9,例如,0.(45),循环节为45,即分母为99;
分子:循环节数字,如0.(45),分子为45
约分化简即可
3.混循环小数,如0.3(4),表示0.3444.......:
分母:首先循环节有多少个数字就有多少个9,未参与循环的小数部分数字个数有几个,就在后面加几个0,如0.345(343),循环节数字个数为3,未参与循环的小数部分为345,所以分母为999000;
分子:如0.345(343),由未参与循环的小数部分加上第一个循环节的小数部分组成的数345343,减去未参与循环的小数部分组成的数字345,得到344998;
#include <iostream> #include <math.h> using namespace std; int gcd(int a,int b) { if(b==0)return a; else return gcd(b,a%b); } int st(int n) { int sum=1; for(int i=1;i<=n;i++) sum=sum*10; return sum; } int main() { int t; cin>>t; string a; while(t--) { cin>>a; int len=a.length(); int sum1=0,sum2=0; int h1=0,h2=0; int flag=0; for(int i=2;i<len;i++) { if(a[i]=='('||a[i]==')') { flag=1; continue; } if(flag) { sum2=sum2*10+(a[i]-'0'); h2++; } else { sum1=sum1*10+(a[i]-'0'); h1++; } } long long x1,x2,x3; if(h2==0) { x1=sum1; x2=st(h1); } else { x1=sum2+(st(h2)-1)*sum1; x2=st(h1)*(st(h2)-1); } x3=gcd(x1,x2); x1=x1/x3; x2=x2/x3; cout<<x1<<"/"<<x2<<endl; } return 0; }