入門oj 1177: [NOIP2014普及組]比例簡化

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章