【题目描述】近似整数 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("1.txt","r",stdin);
int n=1,d=1;
double A;
int L;
int ansN,ansD;
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){
ansSum=fabs(A-sum);
ansN=n;
ansD=d;
}
if(sum>A) d++;
else n++;
}
printf("%d %d\n",ansN,ansD);
return 0;
}