1. 程式人生 > >藍橋杯 ALGO-2 最大最小公倍數

藍橋杯 ALGO-2 最大最小公倍數

題幹

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

輸入格式
輸入一個正整數N。

輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入

9

樣例輸出

504

資料規模與約定
1 <= N <= 10 6 ^6

題解

貪心演算法


貪心演算法只做當下最好的選擇,既然是求 1 ~ n 間最大的最小公倍數,肯定最先考慮的是 n*(n-1)*(n-2),但是分幾種情況

  1. 如果 n 是個奇數,那麼剛好其最大最小公倍數就是 n*(n-1)*(n-2)
  2. 如果 n 是個偶數,n-2 肯定也是個偶數,n 與 n-2 有公約數 2,n(n-1)(n-2) 就不可能是最小公倍數,退而求其次,讓 n-2 變為奇數,即最大最小公倍數為 n(n-1)(n-3)
  3. 上面的結論還有問題,如果 n 是個偶數,又剛好是 3 的倍數,那麼 n-3 肯定也是 3 的倍數,n(n-1)(n-3) 就不可能是最小公倍數,只好再退而求其次,(n-1)(n-2)(n-3)
  4. 最最最後一個問題,如果…n 為 2 或者 1 呢?n=2 最小公倍數就是 2 吧,n=1 公倍數就是 1 吧

等等再看看範圍,10 6 ^6 ,結果 int 肯定存不下了,建議直接定義 long long 變數算了

#include<iostream>
using namespace std;
int main(){
	long
long n; long long ans; cin>>n; if(n<=2) ans = n; else if(n%2==1) ans = n*(n-1)*(n-2); else if(n%3==0) ans = (n-1)*(n-2)*(n-3); else ans = n*(n-1)*(n-3); cout<<ans; return 0; }

檢視題解目錄