- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
求素数的算法及其复的杂度分析
求素数的算法及其复杂度分析 2008-04-05 17:46 关于搜寻一定范围内素数的算
法及其复杂度分析
——曾晓奇
关于素数的算法是信息学竞赛和程序设计竞赛中常考的数论知识,在这里
我跟大家讲一下寻找一定范围内素数的几个算法。看了以后相信
对大家一定有帮助。
正如大家都知道的那样,一个数 n 如果是合数,那么它的所有的因子不超
过 sqrt(n)--n 的开方,那么我们可以用这个性质用最直观的方法
来求出小于等于 n 的所有的素数。
num = 0;
for(i=2; i=n; i++)
{ for(j=2; j=sqrt(i); j++)
if( j%i==0 ) break;
if( jsqrt(i) ) prime[num++] = i; //这个 prime[]是 int 型,跟下
面讲的不同。
}
这就是最一般的求解 n 以内素数的算法。复杂度是 o(n*sqrt(n)),如果 n
很小的话,这种算法(其实这是不是算法我都怀疑,没有水平。当然没
接触过程序竞赛之前我也只会这一种求 n 以内素数的方法。-_-~)不会耗时很
多.
但是当 n 很大的时候,比如 n,n*sqrt(n)30000000000,数量
级相当大。在一般的机子它不是一秒钟跑不出结果,它是好几分钟都跑不
出结果,这可不是我瞎掰的,想锻炼耐心的同学不妨试一试~。。。。
在程序设计竞赛中就必须要设计出一种更好的算法要求能在几秒钟甚至一
秒钟之内找出 n 以内的所有素数。于是就有了素数筛法。
(我表达得不清楚的话不要骂我,见到我的时候扁我一顿我不说一句
话。。。)
素数筛法是这样的:
1.开一个大的 bool 型数组 prime[],大小就是 n+1 就可以了.先把所有的下
标为奇数的标为 true,下标为偶数的标为 false.
2.然后:
for( i=3; i=sqrt(n); i+=2 )
{ if(prime[i])
for( j=i+i; j=n; j+=i ) prime[j]=false;
}
3.最后输出 bool 数组中的值为 true 的单元的下标,就是所求的 n 以内的
素数了。
原理很简单,就是当 i 是质(素)数的时候,i 的所有的倍数必然是合数。如
果 i 已经被判断不是质数了,那么再找到 i 后面的质数来把这个质
数的倍数筛掉。
一个简单的筛素数的过程:n=30。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28 29 30
第 1 步过后 2 4 ... 28 30 这 15 个单元被标成 false,其余为 true。
第 2 步开始:
i=3; 由于 prime[3]=true, 把 prime[6], [9], [12], [15], [18], [21],
[24], [27], [30]标为 false.
i=4; 由于 prime[4]=false,不在继续筛法步骤。
i=5; 由于 prime[5]=true, 把 prime[10],[15],[20],[25],[30]标为
false.
i=6sqrt(30)算法结束。
第 3 步把 prime[]值为 true 的下标输出来:
for(i=2; i=30; i++)
if(prime[i]) printf(%d ,i);
结果是 2 3 5 7 11 13 17 19 23 29
这就是最简单的素数筛选法,对于前面提到的内的素数,用这个
筛选法可以大大的降低时间复杂度。把一个只见黑屏的算法
优化到立竿见影,一下就得到结果。关于这个算法的时间复杂度,我不会描述,
没看到过类似的
文档评论(0)