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


問題描述

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

輸入格式

輸入一個正整數N。

輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入
9
樣例輸出
504
數據規模與約定

1 <= N <= 106

 

解題報告:

這個題的意思就是要我們在1~N的范圍內找三個數,使他們的最小公倍數在這個范圍內的組合是最大的。那么你的第一印象是什么的?我的第一印象是找三個兩兩互質的數,這樣只需要相乘即可,就沒有需要約分的地方。

       接下來先說一個結論:大於1的兩個相鄰的自然數必定互質。

       而對於1~N的范圍,肯定是 n*(n-1)*(n-2)的乘積最大、如果這三個數還兩兩互質的話那就最棒了。

       如果n是奇數,那么 n、n-1、n-2必定兩兩互質,要是有些糾結的話,那么我們就分析在什么情況下可能會存在公因子。n是奇數,那么n,n-1,n-2一定是兩奇加一偶的情況。公因子2直接pass,因為只有一個偶數。假設剩下的n,n-2中有一個數能被3整除,那么有公因子的數一定是n或n-2加減3才能得到的情況。為此,n,n-1,n-2的乘積不僅是最大的,而且一定兩兩互質。

       如果n是偶數,繼續分析n*(n-1)*(n-2),這樣的話n和n-2必定有公因子2,那么就換成式子n*(n-1)*(n-3)。然后仔細思考一下,不行啊,若偶數本身就能被3整除的話,那么式子n*(n-1)*(n-3)也不成立了,n和n-3就有公因子3,再仔細思考一下,式子就變成了(n-1)*(n-2)*(n-3),兩奇夾一偶的情況。

 1 #include<iostream>  
 2 using namespace std;  
 3   
 4 int main() {  
 5     long long n, ans;  
 6     while(cin >> n) {  
 7         if(n <= 2) {  
 8             ans = n;  
 9         }   
10         else if(n % 2) {  
11             ans = n * (n - 1) * (n - 2);  
12         }  
13         else {  
14             if(n%3) ans = n * (n-1) * (n-3);  
15             else ans=(n-1) * (n-2) * (n-3);  
16         }  
17         cout << ans << endl;  
18     }  
19     retur

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM