给出一个小数A,和整数L ,在L中求两个数N和D使得 fabs(A-N*1.0/D)最小
直接枚举即可
第一次枚举的时候,不知道为什么怎么都不对
错误代码:
for(int i=1;i<=L;i++)
{
double k=i*A;
int kk=(int)k;
if(kk>L)
break;
if(minx>fabs(A-kk*1.0/i))
{
minx=fabs(kk*1.0/i-A);
up=kk;
down=i;
}
}
printf("%d %d\n",up,down);
不知道错在了哪里,初步估计是强制转换造成的精度损失。
代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
double A;
while(scanf("%lf",&A)!=EOF)
{
int L;
scanf("%d",&L);
int up=1,down=1;
int ansup=0,ansdown=0;
double minx=99999;
while(up<=L&&down<=L)
{
if(minx>fabs(A-up*1.0/down))//用定义的eps的话也产生了错误,后来发现定义的eps小了,开始是10(-7)后来该到了10(-15);
{
minx=fabs(A-up*1.0/down);
ansup=up;
ansdown=down;
}
if(up*1.0/down>A) down++;
else
up++;
}
printf("%d %d\n",ansup,ansdown);
}
return 0;
}