原題:
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10001st prime number?
翻譯:
列出前6個素數分別是:2,3,5,7,11,和13,我們發現第6個素數是13。
那麼第 10001 個素數是多少?
思路:
代碼
1 /*
2 * 解題思路:
3 * 基本上我還是把每一個Prime Number都存入了列表,最後當列表長度=10001的時候,我列印最後一個。
4 * 但是基於這個思路必須解決兩個問題:
5 * 1、方便的尋找備選數用來判定。
6 * 2、快速的判斷備選數是否為素數。
7 *
8 * 關於尋找:
9 * 尋找使用的技巧來源於我使用了一個數學公式的定律:即任何一個素數都可以寫成 4*N+1 或 4*N+3 的形式 N 屬於 0和正整數。
10 * 這樣我只要,依次疊加迭帶變數i從0開始即可,迅速找出一批備選數。
11 *
12 * 關於判斷:
13 * 判斷的技巧來源於素數本身和素數的集合:集合眾包含了所有的素數,如果新擷取的備選數能被現有素數任意一個整除(即模為0),
14 * 則該備選數不是素數。根據公式可得也不存在偶數的情況,所有備選數均為奇數。
15 */
代碼:
代碼
1 using System;
2 using System.Collections.Generic;
3
4 class The10001stPrimeNumber
5 {
6 internal static int Find10001stPrimeNumber()
7 {
8 List<int> al = new List<int>(10001);
9
10 int tmp;
11 int i = 1;
12
13 al.Add(2); // 積極式載入的一些素數
14 al.Add(3);
15
16 while (al.Count < 10001) // 當正好找到10001個時放棄計算。
17 {
18 tmp = 4 * i + 1;
19 if (CanAddList(al, tmp))
20 {
21 al.Add(tmp);
22 }
23
24 tmp = 4 * i + 3;
25 if (CanAddList(al, tmp))
26 {
27 al.Add(tmp);
28 }
29
30 i++;
31 }
32
33 return al[10000];
34 }
35
36 // 判斷是否是素數。
37 static bool CanAddList(System.Collections.Generic.List<int> al, int num)
38 {
39 bool flag = true;
40
41 foreach (int k in al)
42 {
43 if (num % k == 0)
44 {
45 flag = false;
46 break;
47 }
48 }
49
50 return flag;
51 }
52 }