线性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 }
posted on 2011-12-24 13:24 lzhenf 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lzhenf/archive/2011/12/24/2300271.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值