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;
}