#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
/*将循环小数转化成分数的方法,现介绍如下:1.循环小数0.7272……循环节为7,2两位,因此化为分数为72/99=1/8.即有几位循环数字就除以几个9。又如0.123123……循环节为1,2,3三位,因此化为分数为123/999=41/333.这种方法只适用于从小数点后第一位就开始循环的小数,如果不是从第一位就开始循环的小数,必须用下面的方法。?2.循环小数0.41666……先把0.41666……乘以100得41.666……,可以理解为41+0.666……,所以写成分数为41+6/9=41+2/3=125/3.因为开始乘以了100,所以再除以100,即125/3÷100=125/300=5/12.*/http://acm.hdu.edu.cn/showproblem.php?pid=1717
const int Max=1000000;
int gcd(int x,int y){
if(x==0)return y;
else return gcd(y%x,x);
}
int main(){
int n;
string s;
cin>>n;
while(n--){
int z=0,m=0,c;
cin>>s;
int len=s.length();
if(s.find('(')==string::npos){
for(int i=len-1;i>1;i--){
z+=(s[i]-'0')*pow(10,len-i-1);
}
m=pow(10,len-2);
c=gcd(z,m);
cout<<z/c<<"/"<<m/c<<endl;
}else{
int j,k,len_r;
for(int i=2;i<len;i++){
if(s[i]=='('){
j=i-1; //记录不循环的数末位
k=i;
}
if(s[i]==')'){
len_r=i-k-1; //循环数的长度
}
}
int cnt=0,num=0;
for(int i=k+1;i<=len-2;i++){
cnt=cnt*10+(s[i]-'0'); //分子
num=num*10+9; //分母
}
int inter=0;
for(int i=k-1;i>1;i--){
inter+=(s[i]-'0')*pow(10,k-i-1); //不循环的数字
}
int res=gcd(num,cnt);
num/=res;
cnt/=res;
cnt+=(inter*num);
for(int i=1;i<j;i++){
num*=10;
}
res=gcd(cnt,num);
num/=res;
cnt/=res;
cout<<cnt<<"/"<<num<<endl;
}
}
}
hdu1717
最新推荐文章于 2020-09-30 12:38:30 发布