问题 III
The FORTH programming language does not support floating-point arithmetic at all. Its author, Chuck Moore, maintains that floating-point calculations are too slow and most of the time can be emulated by integers with proper scaling. For example, to calculate the area of the circle with the radius R he suggests to use formula like R * R * 355 / 113, which is in fact surprisingly accurate. The value of 355 / 113 = 3.141593 is approximating the value of PI with the absolute error of only about 2*10^-7. You are to find the best integer approximation of a given floating-point number A within a given integer limit L. That is, to find such two integers N and D (1 <= N, D <= L) that the value of absolute error |A - N / D| is minimal.
Input
The first line of input file contains a floating-point number A (0.1 <= A < 10) with the precision of up to 15 decimal digits. The second line contains the integer limit L. (1 <= L <= 100000).
Process to the end of file.
Output
Output file must contain two integers, N and D, separated by space.
Sample Input
3.14159265358979
10000
Sample Output
355 113
因为A要和N/D最接近,不防设A=N/D,既N=D*A,因为N小于D*A,所以从N开始一直N++,总能找到一个(D一定是)与A相差最小的N/D. 因为|A-N/D|的值必然会先随N的增加先减小后增大.我们求出误差最小的N.
依次求出在D的范围内的N/D,去误差最小的N,D.
不知道算法分析有没有错,我怎么交都没对.
#include <iostream.h>
float abs(float num)
{
return num>0?num:-num;
}
float F(long &N,long D,float A)
{
float t=abs((float)N/D-A);
while(1)
{
if(abs((float)(N+1)/D-A)<t)
{
t=abs((float)++N/D-A);
}
else return t;
}
}
int main()
{
float A,t,T;
long N,D,NN,DD,d;
while(cin>>A>>D)
{
T=D;
for(d=1;d<=D;d++)
{
N=A*d;
t=F(N,d,A);
if(t<T)
{
T=t;
NN=N;
DD=d;
}
}
cout<<NN<<" "<<DD<<endl;
}
return 0;
}