埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
算法思想: 用一个数组sieve[i],下标i对应自然数i,对于数组sieve[i]的值只存0或者1,也就是i划去的时候,就将该数组设为0;for(;k<N+1&&sieve[k]==0;k++); 用K值表示剩下数中的最小数,注意;不可以省略,里面就是不执行任何语句。最外面的for循环,结束条件在里面呢 if(k==N+1)break;最后一个for循环就是从sieve中去掉k及其倍数 sieve[i]=0;
#include <iostream> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ #define N 1000 int main(int argc, char** argv) { char sieve[N+1]={0}; int i=0,k; /*初始时2~N都放在sieve数组中*/ for(i=2;i<N+1;i++) sieve[i]=1; // 初始化1 for(k=2;;){ //找出剩下数中最小者用K表示 for(;k<N+1&&sieve[k]==0;k++); if(k==N+1)break; //退出条件 printf("%d\t",k);//输出素数 //从sieve中去掉k及其倍数 for(i=k;i<N+1;i=i+k) sieve[i]=0; } return 0; }
输出的结果
对于上面的程序,有个很严重的问题的,如果我给#define N 100000000那么如果在linux下一定会出现段错误,为什么会出现段错误,就是因为这个超出了栈的大小,如果要解决这个问题,可以用malloc了,动态开辟么,如果想在linux下查看的话就就用ulimit -a
ulimit -a 进行查询
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 71680
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 71680
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited