ALGO2-最大最小公倍數
阿新 • • 發佈:2019-01-12
題目
問題描述
求1-N裡面,任意三個數的最小公倍數的最大值.
題解
思路:若n 和 n-1和n-2 三個數 兩兩互質的話,那麼結果就是這三個數的積。
根據數論知識:任意大於1的兩個相鄰的自然數都是互質的.
我們可以知道,當n是奇數時,n 和n-2都是奇數,n-1是偶數,那麼他們三個的公約數肯定不是2,而因為這三個數是連續的,所以大於2的數都不可能成為他們或其中任意兩個數的公約數了.結果就是他們三個的乘積.
而當n為偶數時,n*(n-1)(n-2)肯定不行了,因為n和n-2都是偶數,那麼只能將n-2改成n-3,即n(n-1)(n-3),如果這三個數兩兩互質那麼肯定就是結果了.
但是因為n和n-3相差3,所以當其中一個數能被3整除時,另一個肯定也可以.而當其中一個不可以時,另一個肯定也不可以.而因為n為偶數,n-3為奇數,所以2不可能成為他倆的公因子。對於大於3的數,肯定就都不可能成為這三個數或者其中任意兩個數的公約數了.因此只需再對3進行判斷:
如果n能整除3,那麼,n
而n不能整除3,那麼結果就是n*(n-1)*(n-3),因為n和n-3都不能整除3,此時n-1能不能整除3都無關緊要了.而對於其它數 都是不可能的.上面已證.
程式碼
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_ = 100;
int gcd(int a,int b){
int r = a%b;
while(r){
a = b;
b = r;
r = a%b;
}
return b;
}
int lcm(int a, int b){
return a*b/gcd(a,b);
}
int main (){
long long ans, n;
while(cin >> n){
if(n<=2){
ans = n;
}
else if(n%2){
ans = n*(n-1)*(n-2);
}
else {
if(n%3){
ans = n*(n-1)*(n-3);
}
else ans = (n-3)*(n-1)*(n-2);
}
cout<<ans<<endl;
}
return 0;
}