Poj 1650 & Zoj 1601 Integer Approximation (追赶法,分数逼近实数)

来源:互联网 发布:ucloud域名备案 编辑:程序博客网 时间:2024/05/17 01:50

讨论群里有人提起追赶法,于是就搜到了这个题,最后还是没弄明白什么是追赶法……

Zoj上这题的测试数据更强些。

题意:给出一个数字x和一个范围,在这个范围内找两个数字,使它们的商最接近x。

思路一:直接枚举,取n,d为1每次对n,d求商,如果n/d > x,则d增加1,否则n增加1,每次记录下差值最小时n,d的值。

思路二:类似法雷数列进行处理,思想详见上一篇博文

#include <cstdio>#include <cmath>int main (){int limit,p,q;double A,now,del;while (~scanf("%lf%d",&A,&limit)){int n=1,d=1;double min=1e10;while (n<=limit && d<=limit){del=A-1.0*n/d;now=fabs(del);if (now<min){min=now;p=n;q=d;}if (del<=0)d++;elsen++;}printf("%d %d\n",p,q);}return 0;}

#include <cstdio>#include <cmath>double f;int p=100,q=1,n;void Update (int a,int b){if (fabs(f-1.0*a/b)<fabs(f-1.0*p/q))        p=a , q=b;}int main (){while (~scanf("%lf%d",&f,&n)){p=100,q=1;int n1=1,n2=0,d1=0,d2=1;while ((n1+n2) <=n && (d1+d2) <= n){Update(d1+d2, n1+n2);if (1.0*(d1+d2)/(n1+n2)<f)n1+=n2 , d1+=d2;elsen2+=n1 , d2+=d1;}printf("%d %d\n",p,q);}return 0;}


原创粉丝点击