循环小数


Problem Description

1/7 = 0.142857142... 是个无限循环小数。
任何有理数都可以表示为无限循环小数的形式。

本题目要求即是:给出一个数字的循环小数表示法。

Input

整数,整数

每个整数范围均为:1~1000

Output


程序输出两个整数做除法产生的小数或无限循环小数(循环节用方括号括起)。
Sample Input

1,5
1,7
7,6

Sample Output

0.2
0.[142857]

1.1[6]


求循环节,主要判断是否出现循环节,如果出现商和余数都相等的情况就说明循环节出现了,所以可以把余数存在一个数组里,商存在一个数组里,然后多次求商和余数,每求出一组商一组余数就判断一次是否出现循环节



#include<stdio.h>
#include<string.h>
int s[1000],y[1000],q=0,p=0;
int flag=0;
int xun(int sh,int yu)
{
	int i;
	for(i=0;i<q;i++)
	{
		if(s[i]==sh && y[i]==yu)
		{
			flag=i;
			return 0;
		}
	}
	return 1;
}
int main()
{
	int m,n,i,j,k;
	while(scanf("%d,%d",&m,&n)!=EOF)
	{
		flag=0,q=0,p=0;
		int t=0;
		int sh,yu;
		memset(s,0,sizeof(s));
		memset(y,0,sizeof(y));
		int jie=m/n;
		if(m%n==0)
			t=1;
		if(m>=n)
			m=m%n;
		sh=m*10/n;
		yu=(m*10)%n;
		while(xun(sh,yu)==1)
		{
			s[q++]=sh;
			y[p++]=yu;
			yu*=10;
			sh=yu/n;
			yu=yu%n;
		}
		if(t==1)
		{
			printf("%d
",jie);
			continue;
		}
		else
		{
			printf("%d.",jie);
			for(i=999;i>=0;i--)
			{
				if(s[i]!=0)
				{
					k=i;
					break;
				}
			}
			for(i=0;i<flag;i++)
				printf("%d",s[i]);
			for(i=flag;i<=k;i++)
			{
				if(i==flag)
					printf("[");
				printf("%d",s[i]);
				if(i==k)
					printf("]");
			}
			printf("
");
		}
	}
	return 0;
}



原文地址:https://www.cnblogs.com/szj-lxl/p/6684522.html