埃氏筛法--求素数
#include <stdio.h>
#include <string.h>
int n = 1000000;
int mark[1000001];
void swap(int *x,int *y)
{
int temp=*y;
*y=*x;
*x=temp;
}
int main() {
int c;
int n,m;
memset(mark, 0, sizeof(mark));
mark[0] = 1;
mark[1] = 1;
scanf("%d%d",&n,&m);
if(n>m)
{
swap(&n,&m);
}
for (c = 2; c * c <= m; c++) {
if(mark[c]!=1)
{
for(int j=2;j<=m/c;j++)//将能被2 3 5 7 11整除的数字全部标记
{
mark[c*j]=1;
}
}
}
for(int i=n;i<=m;i++)
{
if(mark[i]!=1)
{
printf("%d\n",i);
}
}
return 0;
}
范围是n—>m
假设我们查找
5–>25间的全部素数
2 3 4 5 6 7 8 9 10 11 …25
第一次 我们把2的倍数全部划去于是
3 5 7 9 11 13 15 …25
第二次 我们把3的倍数全部划去于是
2 3 5 7 11 13 17 … 20 25
第三次我们把4的倍数划去(在第二次中已经划完了)
第四次我们把5的倍数划去
2 3 5 7 11 13 17 … 23
第四次我们把6的倍数全部划去(已经被第二次划完了)
第五次我们把7的倍数全部划去
第六次.8的倍数 (已经被划)
第七次.9的倍数(已经被划)
第八次.10的倍数(已经被划)
第九次.11的倍数(这个很重要)
我们验证一个数是否是素数 可以 拿它除 2 3 5 7 11