问题 III

languagec languagec 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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;
}
...全文
评论 18
收藏 已收藏
分享
返回顶部
languagec
数据结构与算法 33,027 成员 35,334 内容