描述
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
输入
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
输出
对每一个对应的小数化成最简分数后输出,占一行。
样例输入
3
0.(4)
0.5
0.32(692307)
0.(4)
0.5
0.32(692307)
样例输出
4/9
1/2
17/52
1/2
17/52
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<cstring>
using namespace std;
int fun(int a,int b){//求最大公约数
if(b==0){
return a;
}
return fun(b,a%b);
}
int main(){
int N,i,len,s1,s2,p1,p2;
int t1,t2,t; //分母 分子 及 最大公约数
char decimal[50];//循环小数
// scanf("%d",&N);
cin>>N;
while(N--){
scanf("%s",decimal);
len = strlen(decimal);
i=0;
while(decimal[i]!='.'&&i<len) i++;
i++;s1=0;p1=1;
while(decimal[i]!='('&&i<len){
s1=s1*10+decimal[i]-'0';
i++;
p1*=10;
}
i++;s2=0;p2=1;
while(decimal[i]!=')'&&i<len){
s2=s2*10+decimal[i]-'0';
i++;
p2*=10;
}
if(s2){
t1 = s1*(p2-1)+s2;
t2 = p1*(p2-1);
}
else{
t1=s1;
t2=p1;
}
t = fun(t1,t2);
printf("%d/%d\n",t1/t,t2/t);
}
return 0;
}