《算法竞赛入门经典》 习题3-8 循环小数

《算法竞赛入门经典》 习题3-8 循环小数

输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。例如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21.

#include<stdio.h>
#include<memory.h>
int main()
{
	int a,b;
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		int count=0;
		int c=a; 
		int ans[3010],repet[3010],s[3010]; 	
		memset(ans,0,sizeof(ans));
		memset(repet,0,sizeof(repet));
		ans[count++]=a/b; //记录整数部分
		a=a%b; //取余数
		while(!repet[a]&&a) /*当出现相同数时,循环节结束,跳出循环,或余数为0时,跳出*/
		{
			repet[a]=count;
			s[count]=a; 
			ans[count++]=10*a/b; //记录小数 
			a=10*a%b;
		} 
		printf("%d/%d=%d.",c,b,ans[0]);
		for(int i=1;i<count&&i<=50;i++)
		{
			if(a==s[i]&&a) printf("(");  // a不等于0,说明有循环节 
			printf("%d",ans[i]);
		}
		if(!a) printf("(0"); //如果没有循环节,循环为0 
		if(count>50) printf("...");
		printf(")\n");
		printf("   %d = number of digits in repeating cycle\n\n",!a?1:count-repet[a]);
	}
	return 0;
 } 

怎么写小数呢,可以算几个数试试,就比如5/2,先取整数2,取余1,1*10/2,取到第一个小数5,怎么算循环呢,当后面的小数与第一个小数重复时,就说明循环到了。
(イヤリングが欲しい)

猜你喜欢

转载自blog.csdn.net/weixin_43326028/article/details/83652803