南沙C++信奧賽陳老師解一本通題 1966:【14NOIP普及組】比例簡化

南沙区信奥赛陈老师發表於2024-10-02

【題目描述】

在社交媒體上,經常會看到針對某一個觀點同意與否的民意調查以及結果。例如,對某一觀點表示支援的有 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 的值儘可能小。

【輸入】

輸入共一行,包含三個整數 A,B,L,每兩個整數之間用一個空格隔開,分別表示支援人數、反對人數以及上限。

【輸出】

輸出共一行,包含兩個整數 A’,B’,中間用一個空格隔開,表示化簡後的比例。

【輸入樣例】

1498 902 10

【輸出樣例】

5 3

【提示】

【資料說明】

對於 100%的資料,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100, A/B ≤ L。

#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
	return b==0?a:gcd(b,a%b);
}
int main() //條件:A'/B'≥ A/B 且 A'/B'- A/B的值儘可能小
{
	int a,b,l,ans_a=0,ans_b=0;
	cin>>a>>b>>l;
	double realValue=a*1.0/b;
	for(int i=1;i<=l;i++)
	{
		for(int j=1;j<=l;j++)
		{
			if(gcd(i,j)==1&& i*1.0/j>=realValue )	//互質且 A'/B'≥A/B
			{
				if(ans_a==0)
				{
					ans_a=i;
					ans_b=j;
				}
				else	//判斷是否 A'/B'- A/B的值更小 
				{
					if( i*1.0/j< ans_a*1.0/ans_b )	//更新答案 
					{
						ans_a=i;
						ans_b=j;
					}//if
				}//else
			}//if
		}
	}
	cout<<ans_a<<" "<<ans_b;
	return 0;
}
南沙C++信奧賽陳老師解一本通題 1966:【14NOIP普及組】比例簡化

相關文章