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


被折叠的 条评论
为什么被折叠?



