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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值