1177: [NOIP2014普及組]比例簡化
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 67 Solved: 54
[Submit][Status][Web Board]
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,每兩個整數之間用一個空格隔開,分別表示支持人數、反對人數以及上限
1≤A≤1000000,1≤B≤1000000 ,1≤L≤100, A/B≤L
Output
輸出共一行,包含兩個整數A’和B’,中間用一個空格隔開,表示化簡後的比例。
Sample Input
1498 902 10
Sample Output
5 3
HINT
這個用小數求近似值,然後滿足他的要求
A’和B’互質(兩個整數的最大公約數是1)的前提下,A’/B’>=A/B且A’/B’-A/B的值儘可能小。
Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<stdlib.h>
using namespace std;
int gcd(int x,int y)
{
if(y==0)return x;
else
return gcd(y,x%y);
}
int main()
{
double a,b,k1,k2,k3;
int a1,b1;
int l;
scanf("%lf %lf %d",&a,&b,&l);
k1=a/b;
k3=l;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
if(gcd(i,j)==1)
{
k2=i*1.0/j;
if(k2>=k1&&k2-k1<k3)
{
a1=i;
b1=j;
k3=k2-k1;
}
}
}
}
printf("%d %d\n",a1,b1);
return 0;
}