线性O(N)时间复杂度求素数 , 筛法

 1 /*
2 线性时间求出1-N 的素数 , 时间复杂度为O( N) ;
3 一个合数可以表示成若干个素数的积
4 比如说 i = 6 =2 * 3 , A = p1 * p2 * p3 .. * pn , 其中pi为素数 ,p1最小 , 只筛到p1 * i即可
5 我们只筛 最小的 2 * i 不筛3 * i ;
6 */
7 #include <stdio.h>
8 #include <memory.h>
9 const int MaxNum = 100000;
10
11
12 bool isPrime[MaxNum] ; //数组定义该数字是否为素数
13 int prime[ MaxNum ] ; // 存下素数
14 int total = 0 ; //第几个素数
15
16 void seive( int Max )
17 {
18 memset( isPrime , true , sizeof( isPrime ));
19 memset( prime , 0 , sizeof( prime ));
20 isPrime[0 ] = false ;
21 isPrime[1] = false ;
22 for ( int i = 2 ; i <= Max ; i++ )
23 {
24 if ( isPrime[i] )
25 prime[ ++ total ] = i ;
26 for ( int j = 1 ; j <= total && i * prime[j] <= Max ; j++)
27 {
28 isPrime[ i * prime[j] ] = false ;
29 if (!( i % prime[j])) break;
30 }
31 }
32 }
33 int main()
34 {
35 int input;
36 seive( MaxNum );
37 while ( scanf("%d" , &input ) , input )
38 {
39
40 printf( "%d" , prime[ input ]);
41 }
42 return 0 ;
43 }
    原文作者:算法小白
    原文地址: https://www.cnblogs.com/lzhenf/archive/2011/12/24/2300271.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞