【C语言】筛选法求素数



筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。

在筛选的过程中,我们可以给每个数字赋值一个指标,1.  在判断过程中,把要筛掉的数字指标改为 0 ,这样循环一遍之后留下来指标仍旧为1的,就是合格的数字

#include <stdio.h>
#include <vld.h>
#include <assert.h>

void SiftPrime(int n)
{
	int *p = (int *)malloc(n*sizeof(int));   //申请内存
    assert(p!=NULL);
	
	int i;
	for(i = 0;i < n;i++)
	{
		p[i] = 1;    //给每个数设立指标1
	}
	p[0] = p[1] = 0;     //改1和2的指标为0

	for(i = 2;i < n;i++)
	{
		for(int j = i+1;j < n;j++)
		{
			if(j%i == 0)
			{
				p[j] = 0;      //将要筛去数字的倍数指标改为0
			}
		}
	}

	for(i = 0;i < n;i++)
	{
		if(p[i]!=0)       //指标不为0的数字
		{
			printf("%d\n",i);     //输出
		}
	}
	free(p);         //释放内存!
}

int main()
{
	SiftPrime(20);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40740059/article/details/80056454