小数化分数2 |
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 2610 Accepted Submission(s): 932 |
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 |
这题是一道很基础的数论题目,只要掌握将无限循环小数转化成分数的规则,就可以迎刃而解了,对于0.(1)=1/9;对于0.0(1)=1/90;进行转化即可。0.1(1)=0.1+0.0(1);
#include<iostream>
#include<string>
using namespace std;
string str;
int gcd(int a,int b){
if(a==0) return b;
if(a>b) return gcd(a%b,b);
else return gcd(b%a,a);
}
int grd(int a,int b){
return a*b/gcd(a,b);
}
void easy(){
int num=1,sum=0;
for(int i=str.length()-1;str[i]!='.';i--){
sum+=(str[i]-'0')*num;
num*=10;
}
cout<<sum/gcd(sum,num)<<"/"<<num/gcd(sum,num)<<endl;
}
void fact(){
int sum=0,num=0,no=1;
if(str[2]=='('){
for(int i=str.length()-2;str[i]!='(';i--){
sum+=(str[i]-'0')*no;
no*=10;
num=num*10+9;
}
cout<<sum/gcd(sum,num)<<"/"<<num/gcd(sum,num)<<endl;
}
else{
int i;
for( i=str.length()-2;str[i]!='(';i--){
sum+=(str[i]-'0')*no;
no*=10;
//cout<<sum<<endl;
}
int result=sum,f=1;
i--;
sum=0;
for(;str[i]!='.';i--){
sum+=(str[i]-'0')*f;
f*=10;
no*=10;
}
no=no-f;
//cout<<no<<" "<<f<<" "<<sum<<endl;
//cout<<no<<endl;
num=no/f*sum+result;
//cout<<num<<endl;
cout<<num/gcd(num,no)<<"/"<<no/gcd(num,no)<<endl;
}
}
int main(){
int n;
while(cin>>n){
while(n-->0){
cin>>str;
int flag=0;
for(int i=0;i<str.length();i++){
if(str[i]=='('){
flag=1;
fact();
}
}
if(!flag) easy();
}
}
return 0;
}