素数
2015-10-12 08:30
190 查看
看了一下午也没有太大收获,先把自己觉得稍微明白了点的记录下。
查找1~N的比较好的算法就是筛选法,筛选法中比较好的处理方式如下:
1. 采用位图数据结构进行存储
位图.数据结构在STL中有,名字好像是叫bitstamp;将所有位都初始化为true
2. 存储数据的内容
A. 只存储奇数(2*i+3,i是位图中的位置,从0开始)
设bitstamp[i]=s ,如果s是素数,那么将bitstamp[s*t+i]设置为false
(其中t是正整数)
下面是数学分析,纠结:
如果第i位的数字s为素数,那么间隔s位处的数字肯定不是素数,是s的倍数,其下标应该是i+t*s
这种筛选会出现重复筛选,可以优化,没学会
B 存储所有数据
s是素数,则下一个起点是s*s,把后面的所有的s*s+2*i*s筛掉
前面小于s*s 的,且是s的倍数,应该会被s前面的素数筛选掉,所以只要从s*s始判断就可以了,2*i*s是跳过为偶数的数字
查找1~N的比较好的算法就是筛选法,筛选法中比较好的处理方式如下:
1. 采用位图数据结构进行存储
位图.数据结构在STL中有,名字好像是叫bitstamp;将所有位都初始化为true
2. 存储数据的内容
A. 只存储奇数(2*i+3,i是位图中的位置,从0开始)
设bitstamp[i]=s ,如果s是素数,那么将bitstamp[s*t+i]设置为false
(其中t是正整数)
下面是数学分析,纠结:
如果第i位的数字s为素数,那么间隔s位处的数字肯定不是素数,是s的倍数,其下标应该是i+t*s
这种筛选会出现重复筛选,可以优化,没学会
B 存储所有数据
s是素数,则下一个起点是s*s,把后面的所有的s*s+2*i*s筛掉
前面小于s*s 的,且是s的倍数,应该会被s前面的素数筛选掉,所以只要从s*s始判断就可以了,2*i*s是跳过为偶数的数字
相关文章推荐
- Ubuntu sun jdk
- Leetcode Binary Tree&n…
- LeetCode:Compare Version Numbers
- Windows Atom 使用
- 过去的2014
- 命名规则
- python 记录
- 日志级别
- 公共DNS
- Perforce使用指南_forP4V
- 转载:notepad++常用设置
- printf 输出补0
- Largest prime factor
- 记个公式
- c++ 关于char *的…
- 时间转化
- Cmder 中文乱码设置
- Cmder alais 设置
- Python gzip
- Zlib gzip 解压缩