分母从1到32767枚举,比较所得的新分式与分式的大小,再依次更新即可,注意是如何更新分子。。。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=32767;
int gcd(int a,int b)
{
int c;
if(a==0)
return b;
while(b!=0)
{
c=b;
b=a%b;
a=c;
}
return a;
}
int main()
{
int i,x,y,l1,l2,minl,minr; //l表示分子,r表示分母
double res,minv,tmp;
scanf("%d%d",&x,&y);
minv=2; //精度
res=double(x)/double(y);
for(i=1;i<=32767;i++) //从1到32767枚举分母
{
tmp=double(x*i)/double(y); //得到分子
l1=floor(tmp);
l2=l1+1;
if(fabs(double(l1)/double(i)-res)<minv && fabs(double(l1)/double(i)-res)>1e-12)
{
minv=fabs(double(l1)/double(i)-res);
minl=l1;
minr=i;
}
if(fabs(double(l2)/double(i)-res)<minv && fabs(double(l2)/double(i)-res)>1e-12)
{
minv=fabs(double(l2)/double(i)-res);
minl=l2;
minr=i;
}
}
int max=gcd(minl,minr);
minl/=max;
minr/=max;
printf("%d %d\n",minl,minr);
return 0;
}