埃拉托斯特尼 之 超出范围100000000



            埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数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;
}

输出的结果

 埃拉托斯特尼 之 超出范围100000000_第1张图片


对于上面的程序,有个很严重的问题的,如果我给#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



你可能感兴趣的:(算法,数学)