HDU 小数化分数 1717
小数化分数2 |
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 3364 Accepted Submission(s): 1232 |
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 |
方法:
将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.
将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int gcd(int m,int n){ return n==0?m:gcd(n,m%n); } int main() { char str[20]; int cyc,uncyc,len,i,up,down,ans,d,y,x,k,l,flag,sum;
int cycandun; //非循环和循环部分总的数位 int T; cin>>T; while(T--){ cyc=0,uncyc=0,len=0,up=0,down=0,sum=0,cycandun=0; y=1,x=0,k=1,l=1; flag=1; scanf("%s",str); len=strlen(str); for(i=2;i<=len-1;i++){
if(str[i]!='('&&flag){ uncyc++; x+=str[i]-'0'; if(str[i+1]!='('&&i!=len-1) x*=10; } else if(str[i]=='(') flag=0; if(str[i]!=')'&&str[i]!='('){ cycandun++; sum+=str[i]-'0'; if(str[i+1]!=')') sum*=10; } } if((cycandun-uncyc)==0){ //cycandun-uncycy=0的话,就是没有循环部分的情况了 sum=1; while(uncyc--) sum*=10; d=gcd(x,sum); cout<<x/d<<"/"<<sum/d<<endl; } else{ up=sum-x; while(cycandun--) k*=10; while(uncyc--) l*=10; down=k-l; d=gcd(up,down); cout<<up/d<<"/"<<down/d<<endl;;} } return 0; }网上看到了一种风格不同的做法
#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; }