NEFU OJ 1643 比例简化

NEFU OJ 1643 比例简化

Problem:1643
Time Limit:1000ms
Memory Limit:65535K

Description

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某观点表示支持的有 1498 人,反对的有 902 人,那么其比例可以简单地记为1498∶902。
因该比例的数值太大,难以一眼看出它们的关系。若把比例记为 5∶3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数 A 和反对人数 B,以及一个上限 L,请将 A 比 B 化简为 A′ 比 B′,要求在 A′和 B′ 均不大于 L,且 A′ 和 B′ 互质(两个整数的最大公约数为 1)的前提下,A′/B′≥ A/B 且 A′/B′-A/B 的值尽可能小。

Input

一行三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。

Output

一行两个整数 A′ 和 B′,中间用一个空格隔开,表示化简后的比例。

Sample Input

1498 902 10

Sample Output

5 3

Hint

单组输入,1<=A,B<=1000000,1<=L<=100,A/B<=L

Code

#include <bits/stdc++.h>
using namespace std;
int m,t,b;

int gcd(int a,int b)
{
	if(a==0)return b;
	if(b==0)return a;
	if(a>b)return gcd(b,a%b);
	else return gcd(a,b%a);
}

int main()
{
	int a,b,l,tmp,aa,bb;
	double fs,minoffset=10000000,real;
	cin>>a>>b>>l;
	tmp=gcd(a,b);
	a/=tmp;
	b/=tmp;
	real=(double)a/b;
	if(a<l&&b<l)cout<<a<<" "<<b;
	else
	{
		aa=a;
		bb=b;
		for(int i=1;i<=l;i++)
		{
			for(int j=1;j<=l;j++)
			{
				if(gcd(i,j)!=1)continue;
				fs=(double)i/j;
				if(fs<real)continue;
				if(fabs(fs-real)<minoffset)
				{
					minoffset=fabs(fs-real);
					aa=i;
					bb=j;
				}
			}
		}
		cout<<aa<<" "<<bb;
	}
	return 0;
}
发布了32 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csg999/article/details/103805548