HDU 1717 无限循环小数化分数

两种情况:

1.纯无限循环小数,0.(4)  令x=0.(4)    10*x=4.(4)=x+4    所以x=4/9   故 0.(abc)=abc/(1000-1)=abc/999

2.混合无限循环小数,0.1(5)    目前还不会推导,但知道具体过程:

0.1(5)    循环体有1位则分母加入9,非循环体有1位则分母加入0,故分母为90(也可以看做是循环体加非循环体共有2位,即100,减去循环体的1位,即10,最后得分母90),分子=非循环体连接一个循环体-非循环体=15-1=14   故,分数为14/90    化简7/45

题目会出现三种小数(多一种正常有限小数)

分三类,分别考虑即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int gcd(int a,int b)
{
	while(b!=0)
	{
		int t=a;
		a=b;
		b=t%b;
	}
	return a;
}
int main()
{
	char s[1000];
	int n;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",s);
		int fenmu=1;
		int fenzi=0;
		int wei=1;
		int feixunhuan=0;
		int i=2;
		int len=strlen(s);
		int flag=0;//0有限小数 1纯无限循环小数 2混合小数 
		if(s[2]=='('){
			flag=1;
			i++;
		} 
		for(;i<len;i++)
		{
			if(s[i]=='(')
			{
				flag=3;
				feixunhuan=fenzi;
			}
			else if(s[i]!=')')
			{
				fenzi=fenzi*10+(s[i]-'0');
				fenmu*=10;
				if(flag!=3) wei*=10;
			}
		}
		if(flag==1) fenmu=fenmu-1;
		if(flag==3){
			fenzi=fenzi-feixunhuan;
			fenmu=fenmu-wei;
		} 
		int c=gcd(fenmu,fenzi);
		fenmu/=c;
		fenzi/=c;
		printf("%d/%d\n",fenzi,fenmu);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30684235/article/details/84798108