原题:

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 }

 

posted on 2010-05-18 10:53  干田  阅读(197)  评论(0编辑  收藏  举报