循环小数

徘徊边缘 提交于 2020-02-04 15:09:52

循环小数:

题目描述:

假设输入a与b,当a=5,b=43,a/b得到无限循环小数,0.116279069767441860465,5后面将会循环下去,他要求你计算循环节的长度(就是不循环的长度),并且还要你输出循环节的数字、

Input:

5 43.

Output:

0.(116279069767441860465) 21.

思路分析:

这道题可以用数组去记录a/b所得的商,但是如何去找循环节的位置呢,那么可以想到当(a%b与a/b)与下一次的(a%b与a/b)相等说明找到了循环节,在用一个数组记录循环节的位置就行了。

代码:

#include<stdio.h>
int main()
{
	int e[3010],e1[3010],e2[3010];
	//e记录商,e1记录循环节出现的位置,e2记录余数 
	int b,c,d=0,h=0;
	scanf("%d %d",&b,&c);
	e[d++]=b/c;
	b=b%c;
	while(!e2[b]&&b)//判断如果该次余数与下次运算的余数相等,说明将会无限循环下去
	               //因为他们除数相等,当被除数(余数)相等时,说明后面将会一直循环相同 
	{
		e2[b]=d;//记录该次的余数 
		e1[d]=b;//记录循环节所出现的位置 
		e[d++]=b*10/c;//记录商 
		b=b*10%c;//下次运算的余数 
	}
	printf("%d.",e[0]);//输出前面小数点 
	for(c=1;c<d;c++)//开始输出 
	{
		if(e1[c]==b && b)
		{
		printf("(%d",e[c]);
		h=c;
	}
		else
		printf("%d",e[c]);
	}
	if(b)//假设b为0,说明刚好整除不是无限循环小数 
	printf(")");
	else
	printf("(0)");
	printf(" %d",d-h);//输出循环节的长度。 
	
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!