1. 程式人生 > >M 兩個序列的公倍數相同,給定N 求M)

M 兩個序列的公倍數相同,給定N 求M)

我們都會求兩個數的最小公倍數,現在的問題和多個數的最小公倍數有關。a和b都是正整數(a<b),用lcm(a,…,b)代表[a,b]區間內的所有數字的最小公倍數,輸入一個正整數N,求最小的M(M>N),滿足: lcm(1,…,M)=lcm(N+1,…,M)。

Input

輸入只有一個數字N(2<=N<=100000)。

Output

輸出滿足條件的最小M。

Example 1

Input

3

Output

6

Example 2

Input

4

Output

8

Explanation

lcm(1,2,3,4,5,6) = lcm(4,5,6) = 60. lcm(1,2,3,4,5,6,7,8) = lcm(4,5,6,7,8) = 840.

解題思路: 對於素數,其有兩條性質:

  1. 初等數學基本定理:任一大於1的自然數,要麼本身是質數,要麼可以分解為幾個質數之積,且這種分解是唯一的。
  2. 在一般領域,對正整數n,如果用2到 之間的所有整數去除,均無法整除,則n為質數。

基於上述兩點認識,可以粗略地得到下述思路: 只要M大於等於 1-N中最大素數的兩倍,就可以滿足上述條件(4除外)

#include<stdio.h>
#include<math.h>


int judgement(int m);

int main()
{
	int N,M;
	scanf("%d", &N);
	if (N != 4)
	{
		int i, judg;
		for (i = N; i >= 2; i--)
		{
			judg = judgement(i);//判斷是否為素數
			if (judg == 1)
				break;
			if (judg == 0)
				continue;
		}

		M = 2 * i;
		printf("%d\n", M);
	}
	else
		printf("%d\n", 8);

	return 0;
}

int judgement(int m)
{
	int head, tail,temp, i;
	float judge;
	head =(int)sqrt(m);
	tail = 2;
	for (i = tail; i <= head; i++)
	{
		judge = 1.0* m / i;
		temp = (int)judge;

		if ((judge - temp) <= 0.000001)
		{
			return 0;
		}
	}
	return 1;
}