素数筛法
何为素数:
就是除了1和它本身,没有其他因数的整数。
注:1既不是素数,也不是合数。
注:来自百度百科专业解说
几种判断素数的方法
方法 (1):
#include <stdio.h> #include <math.h> int main () { int n,i,m; int flag; scanf("%d",&n); if(n<2) flag=0; if(n==2 || n==3) flag=1; m =(int)sqrt(n); if(n>=3) { for(i=2;i<=m;i++) { if(n%i==0) { flag=0;break; } else flag=1; } } if(flag==1) { printf("%d是素数!",n); } else { printf("%d不是素数!",n); } return 0; }
方法 (2):
素数筛法:
输出1-n之间所有的素数
#include <stdio.h> #include <math.h> #include <iostream> using namespace std; #define max 1000000 bool prime[max]; void isprime () { int i; prime[0]=prime[1]=0; prime[2]=1; for(i=3;i<max;i++) { prime[i]=i%2==0?0:1;//如果能整除2,则标记为0否则为1 } int t=(int )sqrt(max*1.0); for(i=3;i<=t;i++) { if(prime[i]) { for(int j=i*2;j<max;j=j+i) { prime[j]=0;//筛 出 i的倍数 能整除i的全部标记为0 } } } } int main () { int n; int i; scanf("%d",&n); isprime(); for(i=1;i<=n;i++) { if(prime[i]==1) { printf("%d ",i);//如果是素数 则输出 } } return 0; }
输入n判断n是否为素数:
//只需要简单那修改上面的代码的输出
#include <stdio.h> #include <math.h> #include <iostream> using namespace std; #define max 1000000 bool prime[max]; void isprime () { int i; prime[0]=prime[1]=0; prime[2]=1; for(i=3;i<max;i++) { prime[i]=i%2==0?0:1; } int t=(int )sqrt(max*1.0); for(i=3;i<=t;i++) { if(prime[i]) { for(int j=i*2;j<max;j=j+i) { prime[j]=0; } } } } int main () { int n; int i; scanf("%d",&n); isprime(); if(prime[n]==1) { printf("%d是素数!",n); } else { printf("%d不是素数!",n); } return 0; }
简单解释素数筛法:
筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratosthenes)。
具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛法”,简称“筛法”。
筛法演示: