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

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

問題描述:

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

輸入格式:

輸入一個正整數N。

輸出格式:

輸出一個整數,表示你找到的最小公倍數。

樣例輸入:

9

樣例輸出:

504

資料規模與約定:

1 <= N <= 10的6次方

題解:

思路:若n 和 n-1和n-2 三個數 兩兩互質的話,那麼結果就是這三個數的積。

根據數論知識:任意大於1的兩個相鄰的自然數都是互質的.

  1. 當n是奇數時,n 和n-2都是奇數,n-1是偶數,那麼他們三個的公約數肯定不是2,而因為這三個數是連續的,所以大於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進行判斷:
  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)
  4. 如果…n 為 2 或者 1,n=2 最小公倍數就是 2 ,n=1 公倍數就是 1 
#include<iostream>
using namespace std;
int main(void)
{
	long long int n, N;
	cout << "請輸入一個整數(1-1000000):";
	cin >> N;
	if (N <= 2)
		n = N;
	else if (N % 2 == 1)
		n = N * (N - 1)*(N - 2);
	else
	{
		if (N % 3 == 0)
			n = (N - 1)*(N - 2)*(N - 3);
		else
			n = N * (N - 1)*(N - 3);
	}
	cout << "最小公倍數為:" << n << endl;
	system("pause");
	return 0;
}