藍橋杯 演算法訓練 最大最小公倍數

2021-09-08 05:10:52 字數 1139 閱讀 8660

題目

問題描述

已知乙個正整數n,問從1~n中任選出三個數,他們的最小公倍數最大可以為多少。

輸入格式

輸入乙個正整數n。

輸出格式

輸出乙個整數,表示你找到的最小公倍數。

樣例輸入

樣例輸出

資料規模與約定

1 <= n <= 106。

想法

利用貪心的思想思考這個問題,貪心思想即在對問題求解時,總是做出在當前看來時最好的選擇。在求解這個問題時,由於要求最大的最小公倍數,所以自然應當從最大的三個數開始討論,在這裡,我們現引入幾個定理。

(1)相鄰兩個自然數互質;

(2)相鄰兩個奇數互質;

(3)兩個整數的乘積等於其最大公約數與最小公倍數的乘積。

現在開始討論:

(1)如果n為奇數,則 n n-1 n-2 為 奇-偶-奇,對於n與n-1及n-1與n-2,由上述定理(1),可知互質,n與n-2由上述定理(2)可知互質。兩兩互質的三個數,根據互質的概念,它們公約數只有1,此時結合定理(3),能夠判斷三者之積即為最大的最小公倍數。

(2)如果n為偶數,則 n n-1 n-2 為 偶-奇-偶,同(1),n與n-1及n-1與n-2互質,但是對於n與n-2,n為偶數,n-2也是偶數,由這樣會導致n與n-2的最小公倍數減半,不值得。因此再利用貪心的思想(我想讓三個不同的數盡可能大,所以把最小的往小調),把n-2調成n-3,此時就可以避免這種情況。

(3)但是,對於n n-1 n-3,如果n%3==0,則(n-3)%3==0,因此會導致二者最大公約數變為1/3,這時要討論這種情況,如果是這種情況,那麼要調整n為n-2,此時與(1)同型別。

實現

#includeusing namespace std;

int main(void)

else

cout《在實現中,我一開始忽略了乙個小細節,就是對n的型別,如果設定為int,即使n輸入不會溢位,但是在運算時n*(n-1)*(n-2)會超出int範圍,雖然結果宣告的變數是long long,但是右邊的表示式還是會按照int處理。

我剛剛接觸這些,才疏學淺,望各位高手指教!

藍橋杯 演算法訓練 最大最小公倍數

演算法訓練 最大最小公倍數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9 樣例輸出 504資料規模與約定 1 n 106。...

藍橋杯 演算法訓練 最大最小公倍數

問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。參考 當n為奇數時,答案一定是n n 1 n 2 當n為偶數時,答案是n a ...

藍橋杯 演算法訓練 最大最小公倍數

問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。思路 首先,從題目的資料規模可以看出題目存在乙個特殊的情形,就是當n小於3的時...