poj1079 2010.2.17

本文介绍了一个算法问题,即如何找到最接近给定分数的最简分数。通过枚举分母并利用类型转换来确保准确计算,该算法能够找出在特定范围内最接近目标分数的最简形式。

poj1079 2010.2.17

题目大意:

给出一个分数,比如1498/902。求出当分母分别为1, 2, ....的时候,最接近1498/902的分数。

比如:

当分母为1的时候,最接近1498/902的分数为 1/1。

当分母为2的时候,最接近1498/902的分数为 3/2。

当分母为3的时候,最接近1498/902的分数为 5/3。

。。。

而且,随着分母的增加,越来越接近原来的分数。

 

注意:分数必须是最简的,不能再约分了。

 

 min存上一个分数与标准分数的差。

 standard存标准分数

 

 

调试原因:

没有进行类型转换,计算时应该把整型强行转换成浮点类型。

 

#include <stdio.h>
#include <string.h>
#include <math.h>

int a,b;
double standard,min;

int okok(int,int);// 判断是不是可以约分,可以约分函数值为0,不可以月份函数值为1;
void doit();// 依次枚举分母,看是不是可以满足条件;

int okok(int x,int y)
{
	int i,pp;
	if ((x==y)&&(x!=1)) return 0;
	if (x>y) pp=y-1;
	else pp=x-1;
	for(i=2;i<=pp;i++)
		if ((x%i==0)&&(y%i==0))
			return 0;
	return 1;
}

void doit()
{
	int i,k1,mid;
	double abss,min1;
	for(i=1;i<=b;i++)
	{
//		printf("%d-------i",i);
		k1=0;
		min1=min;
		mid=(int)(i*standard);
//		printf("mid--------1    %d\n",mid);
		abss=fabs((double)mid/(double)i-standard);
//		printf("abs----1    %lf\n",abss);
		if ((abss<min)&&(okok(mid,i)))
		{
			k1=mid;
			min1=abss;
		}
		mid++;
		abss=fabs((double)mid/(double)i-standard);
//		printf("abs----2    %lf\n",abss);
		if (k1)
		{
			if (abss<min1)
			{
				k1=mid;
				min1=abss;
			}
		}
		else
			if ((abss<min)&&(okok(mid,i)))
			{
				k1=mid;
				min1=abss;
			}
	   if (k1)
	   {
			min=min1;
			printf("%d/%d\n",k1,i);
	   }
	
	}
}



void main()
{
	while (scanf("%d %d",&a,&b)!=EOF)
	{
		min=9999999999.9;
		standard=(double)a/(double)b;
//		printf("%lf    %lf\n",standard,min);
		doit();
		printf("\n");
	}

}
		
		


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值