問題描述
已知乙個正整數n,問從1~n中任選出三個數,他們的最小公倍數最大可以為多少。
輸入格式
輸入乙個正整數n。
輸出格式
輸出乙個整數,表示你找到的最小公倍數。
樣例輸入
9樣例輸出
504資料規模與約定
1 <= n <= 106。
思路:
首先,從題目的資料規模可以看出題目存在乙個特殊的情形,就是當n小於3的時候,這時候任選三個數就一定會出現重複數字,這時最大的最下公倍數就是n本身(個人理解是可以重複選取,否則也無法解釋n>=1這一界限)。
其次,我們就應該考慮n>=3的情況。在這之前我們要了解兩個定理:
1.任意兩個整數,若這兩個數互為質數,則他們的最大公倍數為兩數乘積
2.任意兩個連續的自然數互為質數
根據定理1,我們知道要找到最大的最小公倍,只需要找到三個最大的互為質數的數,而定理2又告訴我們這三個數為連續的三個自然數,即n,(n-1),(n-2)。而這時又會出現兩種不同的情況:為奇數和n為偶數。
1.當n為奇數時,三個數形成奇-偶-奇的情況。因為n和(n-2)都是奇數,所以肯定不存在公因數2。假設三個數其中乙個數存在公因數3,那麼另外的兩個數一定不存在公因數3,因為他們兩兩的差都小於3。也就是說,這三個數不僅最大,而且互為質數,也就是說最大的最小公倍數就是三個數的乘積,即n*(n-1)*(n-2)。
2.當n為偶數時,三個數形成偶-奇-偶的情況。這是n與(n-2)一定存在公因數2,這是計算出來的最小公倍數至少會在他們的乘積基礎上除以2。這時我們稍微縮小一下資料,即n,(n-1),(n-3),這樣就又形成情況1,也就能用乘積的形式表示出最大的最小公倍數,即n*(n-1)*(n-3)。但這樣又出現了新的問題,n與(n-3)可能會出現公因數3,這時我們就要繼續縮小資料,而為了保證奇-偶-奇的結構,只能將唯一的偶數n減2,即(n-1),(n-2),(n-3)。這樣就依然可以通過乘積的形式表示出最大的最小公倍數,即(n-1)*(n-2)*(n-3)。
#include using namespace std;
int main()
else
else
else//當前n為偶數且是3的倍數}}
//輸出
printf("%lld", ans);
return 0;
}
藍橋杯 演算法訓練 最大最小公倍數
演算法訓練 最大最小公倍數 時間限制 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。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 樣例輸出 資料規模與約定 1 n 10 6。這道題在想的時候就想到用常規辦法來寫,但是寫到一半發現套用了4層迴圈,在回過頭...