5 小数化分数

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一
个循环小数化成分数呢 ?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
输入
第一行是一个整数 N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为 0。小数的位数不超过 9 位,循环部分用 () 括起来。
输出
对每一个对应的小数化成最简分数后输出,占一行。
样例输入
3
0.(4)0.5
0.32(692307)
样例输出
4/9
1/2
17/52

在字符数组中,整数0就表示字符串结束标志'\0',所以可用if(ch[i])来判断是否字符串已经到了末尾。

括号的位置和括号的有无是两种情况。

有括号时:要么是纯循环小数,要么是非纯循环小数(不管括号的位置在哪,是同一种处理情况)

无括号时:将分子和分母同时乘以若干倍,化为整数。

参考:https://blog.csdn.net/qq_32925781/article/details/51348101

#include<stdio.h>
#include<cstring>
char ch[15];//在字符串中,一个字符用整数0来表示,和它使用'\0'来表示是一样的,表示字符串结束标志。 
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
} 
int main(){
	//freopen("data.txt","r",stdin);
	int purify=0;//0表示普通小数,1表示纯循环小数,2表示非纯循环小数 
	memset(ch,0,sizeof(ch));
	int aa,bb,cc;
	int n;
	scanf("%d",&n);
	while(n--){
		scanf("%s",ch);
		int a=0,a2,b1=1,b2,c,flag=0;
		for(int i=2;i<15;i++){
			if(ch[i]){
				if(ch[i]!='(' && flag==0){//在左括号的左边 
					a = a * 10 + ch[i] - '0';
					b1*=10;
				}else if(ch[i] =='('){//正好在( 
					flag=1;
					b2=b1;//使用b2将b1保存下来 
					a2=a;//a2将a保存下来 
					
					if(i==2){
						purify=1;//1表示纯循环小数
					}else{
						purify=2;//2表示非纯循环小数
					}
				}else if(ch[i]!=')'){//在(的内部) 
					a = a * 10 + ch[i] - '0';
					b1*=10;
				}else break;
			}
		}
		if(flag==0) purify=0;//0表示普通小数
		if(purify==0){
			cc = gcd(a,b1);
			aa = a/cc;
			bb = b1/cc;
		}else{
			aa = a-a2;
			bb = b1-b2;
			cc = gcd(aa,bb);
			aa /= cc;
			bb /= cc;	
		}
		printf("%d/%d\n",aa,bb);
		memset(ch,0,sizeof(ch));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/87871666