追赶法
【题目描述】近似整数(Approximation.cpp/c/pas) POJ 1650
给定一个浮点数A和一个整数L,求在范围[1,L]内的两个整数n和d,使得n/d能近似等于A,且使误差|A-n/d|最小。
【输入格式】
第一行为一个浮点数A,第二行为一个整数L。
【输出格式】
两个整数n和d。
【输入样例】
3.14159265358979
10000
【输出样例】
355 113
追赶法:不断比较得出min(A-n/d),在n/d>A时d++,相反则n++,即基本的追赶问题。
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
freopen("Approximation.in","r",stdin);
freopen("Approximation.out","w",stdout);
int n=1,d=1;
double a;
int l;
int ansa,ansb;
double anssum=999999999.9999999;
double sum;
scanf("%lf%d",&a,&l);
while(n<=l&&d<=l){
sum=double(n*1.0/(d*1.0));
if(fabs(a-sum)<anssum) {
ansa=n,ansb=d;
anssum=fabs(a-sum);
}
if(sum>a) d++;
else n++;
}
printf("%d %d\n",ansa,ansb);
return 0;
}