算法 素数筛法
来源:互联网 发布:国家电网网络大学答案 编辑:程序博客网 时间:2024/06/07 06:28
素数筛法
关键思想
素数筛法是ACM 及各大比赛中必须熟练掌握的最低级的算法,在已知某些素数的情况下对未判断的数进行筛选,筛选掉必然不是素数的数。如何对数进行筛选,依据素数的性质,某个除1以外的正整数是素数,则该数的倍数一定不是素数
举个栗子
从1-10中筛选出所有素数
以第一步为例:当前元素为2,则将
循环上述过程,则可得到最终的数组,数组中为0的则该元素为素数,否则为合数。
代码如下
#include <cstdio>#define MAXN 11int prime[MAXN] = {1, 1}; //第0,1个元素直接设为合数,合数设为1,素数为0int main() { //素数筛法求素数 for (int i = 0; i < MAXN; ++i) { if (!prime[i]) {//若该数是素数,则将该数的倍数全设为合数。 //printf("%d ",i); 答应当前元素 for (int j = 2 * i; j <= MAXN; j+=i) {//筛选掉必然是合数的数 prime[j] = 1; } } } return 0;}
复杂度
该算法的复杂度为
关于优化
在素数筛法的过程中,有许多重复计算的过程可以进行优化,例如上述例子中,元素6和元素10都筛选了两次,就是表格中红了两次。
下边列一下可以优化的点,就不具体实现了。
1. 避免重复筛选
2. 偶数直接可以不参与筛选,并且依据这个规则可以将数组大小优化掉一半
说明一下第二点可以优化空间的方法,例如原数组的第
进阶
想继续学习素数有关知识的可以看看以下几个知识点
- 费马测试
- Miller-Rabin 质数测试
- 欧拉-雅科比测试
- AKS质数测试
等等素性测试算法,可能以后会在详细讨论这些算法。
1 0
- [算法]素数筛法
- 算法 素数筛法
- 算法之素数筛法
- 简单算法之素数筛法
- 素数筛法算法(C#)
- 素数筛算法
- 素数筛算法
- 筛选法求素数算法
- 计算素数(质数)java算法(应该是筛法)
- Java编程算法基础---素数与筛法
- 《C算法》读书笔记 (3):素数筛法
- 素数算法
- 素数算法
- 素数算法
- 素数算法
- 素数算法
- 素数算法
- 素数算法
- Command line instructions
- OpenCV简介
- Pyramid Helloworld
- Kafka High Availability(2)
- 浅谈JavaScript原型链继承方式与闭包
- 算法 素数筛法
- 自制IOS顶部状态栏详解
- jmeter 性能测试,关于session保持的问题解决
- linux wget 命令用法详解(附实例说明)
- Android Studio 中查看上SHA1和MD5值
- windows/linux file format transfer
- 新浪云独立域名绑定
- Eclipse:设置js提示
- SSH2之搭建Hibernate(二)