C++筛法求质

判断一个质数我们往往直接暴力,可如果是在循环中要大量的去判断质数的话,直接暴力时间复杂度太高了。因此我们想到可以开一个bool数组来存储一个数是否为质数,而生成这个数组,我们就可以应用到筛法求质了。

筛法求质

思路很简单,就是先让所有的flag都为true,之后特判将flag[1] = false,接着从2枚举到n如果这个数还是true,就将所有除它自己本身以外所有的是它倍数的数赋值为false,这样判断i是否为质数看flag[i]的真假就行了。

代码实现并不难,就是一个简单的模拟。

(PS:NR是指n的上限)

# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;

# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)

const int NR = 100000;

int n;
bool flag[NR + 10]; 

int main()
{
	scanf("%d", &n);
	memset(flag, 1, sizeof(flag));
	flag[1] = false;
	FOR(i, 2, n)
		if(flag[i]){
			for(int j = 2; i * j <= n; j++)
				flag[i * j] = false;
		}
	FOR(i, 1, n)
		if(flag[i]) printf("%d ", i);
	puts("");
	return 0;
}

God Bless You For Ever!

发布了33 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/SkeletonKing233/article/details/99861674