素数筛选
2016-03-22 20:46
183 查看
对于大量数据中查找素数的问题,由于数据量特别大时间定特别长,此时就能体现算法的作用,下面总结一下素数筛选的基本方法
具体筛法是:先把n个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
原始代码(原理)
#indfine maxn 10000000
bool pri[maxn]
void pring()
{
memset(pri,true,sizeof());
pri[0]=pri[1]=0;
t=(int)sqrt(max);
for(int i=2;i<t;i++)
{
if(pri[i])
for(int j=i;j<maxn;j+=i)//聪明的你一定能理解的
pri[j]=0;
}
}
优化代码
#indfine maxn 10000000
bool pri[maxn]
void pring()
{
memset(pri,true,sizeof());
t=(int)sqrt(max);
for(int i=2;i<t;i++)
{
if(pri[i])
for(int j=i*i;j<maxn;j+=i)
pri[j]=0;
}
}
具体筛法是:先把n个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
原始代码(原理)
#indfine maxn 10000000
bool pri[maxn]
void pring()
{
memset(pri,true,sizeof());
pri[0]=pri[1]=0;
t=(int)sqrt(max);
for(int i=2;i<t;i++)
{
if(pri[i])
for(int j=i;j<maxn;j+=i)//聪明的你一定能理解的
pri[j]=0;
}
}
优化代码
#indfine maxn 10000000
bool pri[maxn]
void pring()
{
memset(pri,true,sizeof());
t=(int)sqrt(max);
for(int i=2;i<t;i++)
{
if(pri[i])
for(int j=i*i;j<maxn;j+=i)
pri[j]=0;
}
}
相关文章推荐
- HDU 3065 病毒侵袭持续中(AC自动机)
- HD_1241Oil Deposits(DFS)
- Android CardView使用详解
- Android:ListView.addHeaderView()用法及其注意事项
- 南阳题目57-6174问题
- CF 342div2 C 贪心
- 软件测试面试总结
- Oracle Day05 集合与数据处理
- lightoj 1319 - Monkey Tradition (中国剩余定理)
- HDU 4763 数据结构之KMP+二分
- 蛇形填数的递归实现
- Java基础学习第二十一天——递归与字节流
- js url传值中文乱码之解决之道
- 我所理解的JS执行环境和作用域链
- 第三周作业(三)---WordCounter
- 标志数在wordcount程序中的应用与拓展
- LightOj 1064 Throwing Dice(概率dp)
- 2946: [Poi2000]公共串 后缀数组
- Blue Jeans (HDU_3080) KMP + 枚举
- Html+CSS hack技术介绍 以及常用hack