最接近的分数
【问题描述】
给出一个正实数,找出分子与分母均不超过n的最简分数,使其最接近给出的实数。“最接近”是指在数轴上该分数距离给出的小数最近,如果这个分数不惟一,输出分子最小的一个。
【输入】
输入共二行:
第一行只有一个正整数:n
第二行只有一个正实数:x
【输出】
输出共二行:
第一行只有一个正整数:分子
第二行只有一个正整数:分母
【输入样例】
5
0.51
【输出样例】
1
2
【数据规模】
50% 的数据: \(1 \le n \le 1 000\)
80% 的数据: \(1 \le n \le 100 000\)
100% 的数据: \(1 \le n \le 10 000 000\)
时间限制 : 1s
空间限制 : 256M
设这个分数是\(\dfrac{a}{b}\),那么\(\dfrac{a}{b}\)要尽量接近\(x\),也就是\(bx\)要尽量接近\(a\).枚举b,然后找到\(bx\)最接近的正整数\(a\),找到差距最小的那个,然后如果差距一样那就按照\(a\)判断。当然,b越小,a越小,所以可以直接按照先找到的来。注意最接近的\(a\)有可能超出\(n\),需要判断。
#include
using namespace std;
int n,p,q,r;
double ret=999999999,x;
double abss(double x)
{
if(x<0)
return -x;
return x;
}
int main()
{
cin>>n>>x;
for(int i=1;i<=n;i++)
{
r=i*x;
if(r>n)
r=n;
if(abss(ret-x)>abss((double)r/i-x))
p=r,q=i,ret=(double)r/i;
++r;
if(r<=n)
if(abss(ret-x)>abss((double)r/i-x))
p=r,q=i,ret=(double)r/i;
}
cout<