原题:
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 个素数是多少?
思路:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 */
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 */
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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 }