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;
}