求分数的精确值

/*************************************************************************
    > File Name: 45.c
    > Author: ma6174
    > Mail: ma6174@163.com 
    > Created Time: 2017年05月17日 星期三 20时09分56秒
 ************************************************************************/

#include<stdio.h>
//题目:求分数的精确值,如果是有限小数,直接输出,如果是循环小数输出第一次循环

   

int cmp(int *, int, int);//判断无限小数是否完成第一次循环
int output(int *, int);//输出函数
int div(int*, int, int);//将分数存入数组
int main()
{
	int a, b;
	int d[100];//数组第一位是存小数点前的值,后面存小数点之后的值,数组一位对应一位小数
	int c, i;
	printf("please input a fraction\n");
	scanf("%d/%d", &a, &b);

	i = div(d, a, b);//div返回数组长度
	output(d, i);//输出 
	return 0;
}


int div(int d[], int a, int b)
{
	int i = 0, o[100] = {0};
	int f = 1;
	
	while(i < 100)
	{
		d[i] = a / b;
		o[i] = a % b;
		f = a % b;
		a = o[i] * 10;
		i++;
		if(f == 0)//如果f = 0 数组是有限的直接退出循环
		{
			break;
		}
	}
	return i;
}

int output(int d[], int c)
{
	int i = 0, j = 0;
	int f = 0;
	int l;
	if(c < 100)//c < 100 说明是有限
	{
		printf("get a finite fraction:");
		for(i = 0; i < c; i++)
		{
			if(i == 1)
			{
				printf(".");
			}
			printf("%d", d[i]);
		}
	}
	else
	{
		for(i = 0;i < c; i++)
		{
			for(j = i + 1; j < 100; j++)
			{
				if(d[j] == d[i])//i,j是小数的两位,确定i后,从i+1位寻找j位,使得j位等于i位 
				{
					if(cmp(d, i, j))//若j - i = l再判断i到i+l是否分别等于j到j+l若成立  输出该小数,从0位到j--位
					{
						if(f == 1)
						{
							break;
						}
						f = 1;
						printf("get a infinite fraction:");
						for(l = 0; l <= j; l++)
						{
							if(l == 1)
							{
								printf(".");
							}
							printf("%d", d[l]);
						}
						printf("\nthe circle begin %dand end in %d after decimal point\n", i, --j);
					}
				}
			}
		}
	}
	printf("\n");
}

int cmp(int d[], int i, int j)//判断i到i + n位是否分别等于j到j + n位
{
	int	t = j;
	for(; i < j; i++, t++)
	{
		if(d[i] != d[t])
		{
			return 0;
		}
	}

	return 1;
}
结果:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值