算法訓練-最大最小公倍數

證法參考自點擊打開鏈接

注意點:1<=N<=10^6, long型過

題目

問題描述

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

輸入格式

輸入一個正整數N。

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

根據數論知識:任意大於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-1)*(n-3)就肯定不行了,因爲n和n-3有了公約數3,結果肯定小了,那麼就只能繼續判下一個即n*(n-1)*(n-4)而這樣n-4又是偶數,不行繼續下一個n*(n-1)*(n-5) = n^3 -6*n^2 + 5*n 而如果這個可以 那個其值肯定要小於(n-1)*(n-2)*(n-3) = n^3 -6*n^2+11n-6(對於n>1來說都成立),而(n-1)*(n-2)*(n-3)由上一個奇數結論可知是一個符合要求的,因此到n-5就不用判斷了。直接選答案爲(n-1)*(n-2)*(n-3);

而n不能整除3,那麼結果就是n*(n-1)*(n-3),因爲n和n-3都不能整除3,此時n-1能不能整除3都無關緊要了.而對於其它數 都是不可能的.上面已證.

/*最小的公倍數中最大的 1<=N<=10^6*/ 
/*
①<=2 本身
②是2的倍數 1)是三的倍數(n-1)*(n-2)*(n-3) 2)不是三的倍數n*(n-1)*(n-3)
③不是2的倍數  n*(n-1)*(n-2)
*/
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<stack>
#include<cmath>
#include<iostream>
using namespace std;
int main(){
	long long n;
	cin>>n;
	
	if(n<=2)
	{
		cout<<n<<endl;
		return 0;
	 } 
	 else if(n%2!=0){// 9->9*8*7
	 	n=n*(n-1)*(n-2);
	 }
	 else{
	 	if(n%3==0){//6->5*4*3 12->11*10*9 
	 		n=(n-1)*(n-2)*(n-3);
		 }
		 else{//8->8*7*5
		 	n=n*(n-1)*(n-3);
		 }
	 }
	 cout<<n<<endl;

return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章