M 兩個序列的公倍數相同,給定N 求M)
阿新 • • 發佈:2018-12-11
我們都會求兩個數的最小公倍數,現在的問題和多個數的最小公倍數有關。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的自然數,要麼本身是質數,要麼可以分解為幾個質數之積,且這種分解是唯一的。
- 在一般領域,對正整數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; }