小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4639 Accepted Submission(s): 1895
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
题意;将小数化成分数,小数包括普通小数(有限小数)和无线循环小数。
题解:普通小数,很简单,肯定能乘以一个10^k后变为整数,即小数a*10^k=b(b为整数),所以a=b*10^k/10^k。通分下就OK了。再是无线循环小数,拿样例中的a=0.32(692307)来说明方法,a*10^6=326923.07(692307)-->
a*10^6-a=(10^6-1)*a=326923.07-0.32-->
(100^6-1)*100*a=32692307-32-->
a=(32692307-32)/(10^8-100);通分下结果就出来了,这个方法就是化去无线循环部分,使它变为普通小数。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; char a[20]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int T; cin>>T; while(T--) { int i,j,k,n,p,q,d; cin>>a; n=strlen(a); for(i=2;i<n;i++) if(a[i]=='(')break; if(i>=n) { p=0,q=1; for(i=2;i<n;i++) { p=p*10+a[i]-'0'; q=q*10; } d=gcd(p,q); cout<<p/d<<"/"<<q/d<<endl; } else { int x=1,y=0; p=1; q=0; for(i=2;i<n;i++) { if(a[i]=='(')break; y=y*10+a[i]-'0'; } for(j=i+1;j<n-1;j++)p=p*10; p--; for(i=2;i<n-1;i++) { if(a[i]=='('){p=p*x;continue;} x*=10; q=q*10+a[i]-'0'; } q=q-y; d=gcd(p,q); cout<<q/d<<"/"<<p/d<<endl; } } return 0; }