Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52
循环小数化分数的方法请参考这个博主的,链接在这里给出了,感兴趣的小伙伴们可以去看一下哈:https://wenku.baidu.com/view/561773c62cc58bd63186bd87.htm
AC代码
#include<stdio.h>
#include<string.h>
//求出a,b的最大公约数
int gcd(int a,int b){
if(b==0)
return a;
return gcd(b,a%b);
}
int main(void){
int t,n;
char s[15];
scanf("%d ",&t);
while(t--){
scanf(" %s",&s);
n=strlen(s);
//求出循环体前边的数
int x=0,y=1,i;
for(i=2;i<n;i++){
if(s[i]!='(') {
x=10*x+s[i]-'0';// 分子扩大
y=10*y;//分母扩大和分子一样
}else{
break;
}
}
//不是循环小数
if(i==n){
int d=gcd(x,y);
printf("%d/%d\n",x/d,y/d);
continue;
}
//求出整个有循环体的小数
int xx=x,yy=y;
for(int j=i+1;j<n;j++){
if(s[j]!=')'){
xx=10*xx+s[j]-'0';
yy=10*yy;
}else{
break;
}
}
int a=xx-x;
int b=yy-y;
printf("%d/%d\n",a/gcd(a,b),b/gcd(a,b));
}
return 0;
}