poj1079 2010.2.17

来源:互联网 发布:淘宝链接e22a 编辑:程序博客网 时间:2024/04/30 14:29

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;}}elseif ((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");}}

0 0
原创粉丝点击