最接近的分数


【问题描述】
给出一个正实数,找出分子与分母均不超过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<