Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52
小数化分数的方法,非循环的部分就乘以10的n次方作为分子 循环部分比如0.444 就是4/9
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
char s[30];
long long gcd(long long a,long long b){
if(b==0){
return a;
}
return gcd(b,a%b);
}
int main(void){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int len=strlen(s);
bool flag=false;
int idx=0;
for(int i=2;i<len;i++){
if(s[i]=='('){
flag=true;
idx=i;
break;
}
}
if(flag){
long long mu_1=pow(10,idx-2);
long long zi_1=0;
for(int i=2;i<idx;i++){
zi_1=zi_1*10+(s[i]-'0');
}
long long g=gcd(mu_1,zi_1);
mu_1/=g;
zi_1/=g;
long long zi_2=0;
long long mu_2=0;
for(int i=idx+1;s[i]!=')';i++){
zi_2=zi_2*10+(s[i]-'0');
mu_2=mu_2*10+9;
}
mu_2*=(pow(10,idx-2));
zi_1*=mu_2;
zi_2*=mu_1;
mu_1*=mu_2;
long long zi=zi_1+zi_2;
long long mu=mu_1;
g=gcd(mu,zi);
zi/=g;
mu/=g;
printf("%lld/%lld\n",zi,mu);
}
else{
long long mu=pow(10,len-2);
long long zi=0;
for(int i=2;i<len;i++){
zi=zi*10+(s[i]-'0');
}
long long g=gcd(mu,zi);
mu/=g;
zi/=g;
printf("%lld/%lld\n",zi,mu);
}
}
return 0;
}