筛法打素数表是一种高效的打表方法,体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。c这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。需要注意的是,选取质数的时候,循环只需到sqrt(n)就可以。
与之前的简单打表相比,来分析一个两种方法的效率。
先看一下简单方法,对于每个需要判断的整数i,最多需要做sqrt(i)次求模的操作,因此算法的效率为sqrt(3)+sqrt(4)+sqrt(5)+sqrt(6)+sqrt(7).......+sqrt(N)
再分析一下筛法,对于sqrt(N)以内的素数i,做N/i次筛选操作,因此我们可以看到次算法的效率为N/2+N/3+N/5+N/7+N/11+.......+N/k(K是小于sqrt(N)的最大素数)
简单的数值分析计算一下上面的2个级数,可以看到后者明显小于前者
#include<iostream> #include<cmath> #include<cstdio> using namespace std; int const maxm=1000001; int prime[maxm]; void sievePrime() { for(int i=0;i<maxm;i++) prime[i]=1; prime[0]=0; prime[1]=0; int max=sqrt(maxm*1.0); for(int i=2;i<=max;i++) { if(prime[i]) for(int j=i+i;j<maxm;j=j+i) { prime[j]=0; } } } int main() { sievePrime(); /*for(int i=2;i<=1000;i++) { if(prime[i]) { cout<<i<<" "; } }*/ //cout<<endl; int n; while(scanf("%d",&n)!=EOF&&n) { for(int i=3;i<maxm;i++) { if(i%2!=0) { if(prime[i]) { if(prime[n-i]) { printf("%d = %d + %d\n",n,i,n-i); //cout<<n<<" = "<<i<<" + "<<n-i<<endl; break; } } } } } return 0; }
发表评论
-
图的割点tarjan---zoj_1119
2011-10-24 23:00 1242http://acm.zju.edu.cn/on ... -
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1652http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1720http://acm.zju.edu ... -
NIM博弈游戏,SG函数---zoj_3084,zoj_2083
2011-09-23 23:00 1325Nim游戏是两个人进行的游戏有如下规则: ... -
多重背包--zoj_2156
2011-09-14 11:10 875首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1289朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1677题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2497AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1196二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2144网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 873trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 924bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1080我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1667LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2853zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1376染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 763线段树是一种二叉树的拓展,在线段树每个节点中 ... -
快速排序(qsort)
2011-06-16 17:03 783快速排序是一种高效的非稳定排序,它的基本思路 ... -
斐波那契散列
2011-06-16 16:38 3087斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1292本文大量 ...
相关推荐
利用筛法求素数利用筛法求素数利用筛法求素数利用筛法求素数利用筛法求素数
使用埃拉托斯特尼筛法寻找质数的C++函数
最快的素数筛法, 2秒初始化后在奔腾4上能算出2^31 以内素数个数,之后10ms内算出任意 0-2^31之间素数个数,可快速的计算第k个素数, 枚举区间[n, m](m - n ^5)以内素数等 还可以计算第k个数,分因素分解 Prime[78499]...
素数筛法打表 //j=i等价于 j=i*2,即j是i的两倍,而最后的j+=i,则表示下一个循环j是i的3倍,接着4倍。。。 //i的所有2~N倍数肯定都不是素数,因此将flag置为0,直到最后一位。
利用C++实现了筛法求素数。代码简洁、明了、易懂。详情见附件。
计算10^18素数筛法, 目前这个是国内最快的筛法程序(如果你有比我还快的, 个人给你500元奖励 * 快的倍数),比国外primesieve略慢20%, , 使用非常方便, 输入两个数得到素数个数, 共计3000行C++代码。采用10多...
线性筛法求素数的原理与实现
之前在考研机试的时候看到了这个素数筛法,觉得还挺有趣的。解释下其中的一点,j为什么从i*i开始,按照一般思路应该从i*2开始的,但是仔细分析会发现i*i已经覆盖了i*2这个条件了,因此从i*i开始了。
使用数组,运用筛法球素数,效率高,只需该变N的大小变可以求出N以内的素数。
讲述O(n)筛法求素数的经典论文 ---------- A Linear Sieve Algorithm for Finding Prime Numbers David Gries Cornell University Jayadev Misra University of Texas at Austin
最快的素数筛法, 2秒初始化后在奔腾4上能算出2^31 以内素数个数,之后10ms内算出任意 0-2^31之间素数个数,可快速的计算第k个素数, 枚举区间[n, m](m - n ^5)以内素数等 k e8 ----------------------start find kth ...
python3的廖雪峰,关于filter,利用埃氏筛法求素数的。
编程实现加解密的基本运算。 (1)移位 (2)逻辑运算 (3)欧几里德算法求两个整数的最大公约数 (4)素数的判定和寻找(筛法)
判断质数的改进方法。
数据结构中利用线性表和单链表实现筛选素数的功能。
用筛法与不要筛法求素数的比较 C++ VC6.0调试成功
本代码是zoj上AC的1951的代码,把双重循环简化为O(n),不过素数判断的改进还不够
ex_08_05筛法素数作业.cpp
素数判断用Java程序写的Applet小程序 输入任意证书均可以判断是否是素数
一种快速素数筛法