Home  >  Article  >  Database  >  Hdu 1717 小数化分数2

Hdu 1717 小数化分数2

WBOY
WBOYOriginal
2016-06-07 15:31:271405browse

众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几、百分之几、千分之几……的数。那么无限小数能否化成分数? 首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数。无限不循

众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几、百分之几、千分之几……的数。那么无限小数能否化成分数? 

首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数。无限不循环小数不能化分数,这在中学将会得到详尽的解释;无限循环小数是可以化成分数的。那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几、百分之几、千分之几……的数。其实,循环小数化分数难就难在无限的小数位数。所以我就从这里入手,想办法“剪掉”无限循环小数的“大尾巴”。策略就是用扩倍的方法,把无限循环小数扩大十倍、一百倍或一千倍……使扩大后的无限循环小数与原无限循环小数的“大尾巴”完全相同,然后这两个数相减,“大尾巴”不就剪掉了吗!我们来看两个例子:

⑴    把0.4747……和0.33……化成分数。

想1:        0.4747……×100=47.4747……   

0.4747……×100-0.4747……=47.4747……-0.4747……

(100-1)×0.4747……=47

即99×0.4747…… =47 

那么  0.4747……=47/99


想2: 0.33……×10=3.33……

0.33……×10-0.33……=3.33…-0.33……

(10-1) ×0.33……=3

即9×0.33……=3

那么0.33……=3/9=1/3

由此可见, 纯循环小数化分数,它的小数部分可以写成这样的分数:纯循环小数的循环节最少位数是几,分母就是由几个9组成的数;分子是纯循环小数中一个循环节组成的数。

⑵把0.4777……和0.325656……化成分数。

想1:0.4777……×10=4.777……①

0.4777……×100=47.77……②

用②-①即得: 

0.4777……×90=47-4

所以, 0.4777……=43/90

想2:0.325656……×100=32.5656……①

0.325656……×10000=3256.56……②

用②-①即得: 

0.325656……×9900=3256.5656……-32.5656……

0.325656……×9900=3256-32

所以, 0.325656……=3224/9900

将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.

  将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.

#include <cstdio>

int Gcd (int x,int y)
{
	return y==0?x:Gcd(y,x%y);
}

int main ()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		char str[15];
		scanf("%s",str);
		bool t=false;  //是否循环
		int p=0,q=0;   //p不循环部分位数,q循环部分位数
		int x=0,y;     //x不循环部分数值,y小数数值
		int k=1,l=1,tmp;
		for (int i=2;str[i];i++)
		{
			if (t==false && str[i]!='(') {p++;x*=10;x+=str[i]-'0';}
			if (t && str[i]!=')') {q++;y*=10;y+=str[i]-'0';}
			if (str[i]=='(') {t=true;y=x;q=p;}
		}
		if (q==0) //不循环
		{
			while (p--)
				k*=10;
			tmp=Gcd(x,k);
			printf("%d/%d\n",x/tmp,k/tmp);
		}
		else
		{
			int m=y-x;
			while (p--)
				k*=10;
			while (q--)
				l*=10;
			int n=l-k;
			tmp=Gcd(m,n);
			printf("%d/%d\n",m/tmp,n/tmp);
		}
	}
	return 0;
}
</cstdio>


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn