算法:判断有限还是无限循环小数并寻找循环节

问题
读人自然数m和n(0≤m<n≤1000),判断分数m/n是有限小数还是循环小数。
如果m/n是有限小数,则输出分数的值;如果m/n为循环小数,则把循环部分括在括号中,并打印输出。

代码:

#include<stdio.h>

bool f(int n)	//判断是否是有限还是循环
{
	if (n == 1)
		return true;
	else if(n%2==0)
	{
		f(n / 2);
	}
	else if(n%5==0)
	{
		f(n / 5);
	}
	else
	{
		return false;
	}
}
int gcd(int x, int y)
{
	int r;
	while (x % y)
	{
		r = x % y;
		x = y;
		y = r;
	}
	return y;
}
bool find(int *yu,int y)//判断是否找到循环节
{
	int i;
	for (i = 0; i < y-1; i++)
	{
		if (yu[y - 1] == yu[i])
		{
			return false;		//找到了,跳出循环
		}
	}
	return true;
}
void main()
{
	int m, n;
	double d;
	int x = 0, y = 0, flag, i, gcd0;
	int zheng, xiao[100] = { 0 }, yu[100] = { 0 }, r, s;
	puts("请输入自然数m,n(0<=m<n<=1000)");
	scanf("%d %d",&m,&n);
	gcd0 = gcd(m, n);
	m = m / gcd0;
	n = n / gcd0;		//化为最简分数
	if (f(n))
	{
		d = m*1.0 / n;
		printf("有限小数:%lf",d);
	}
	else
	{
		zheng = m / n;

		r = m;
		s = r * 10 / n;		//第一组
		xiao[x++] = s;
		yu[y++] = r;		//存入第一组数据



		while (find(yu,y))
		{
			r = (r * 10) % n;
			s = r * 10 / n;
			xiao[x++] = s;
			yu[y++] = r;

		}
		for (i = 0; i < y - 1; i++)
		{
			if (yu[y - 1] == yu[i])
			{
				flag = i;
			}
		}
		printf("循环小数:%d.",zheng);
		
		for (i = 0; i < flag; i++)
		{
			printf("%d", xiao[i]);		//打印不循环小数部分
		}
		printf("(");
		for (i = flag; i < y - 1; i++)
		{
			printf("%d",xiao[i]);		//打印循环小数部分
		}
		printf(")");

	}

题目给定了n>m,若m>n,程序可能有点问题,以后有时间再改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值