#include <iostream>

using namespace std;

// 埃氏质数筛  1e7
// 所有质数的倍数都是合数(1倍除外)
// 标记合数
int pri[10000005]; // pri[i] = 0,说明i是质数

// 标记过程,搭配代码自己理解一下
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
//0 0 0 0 1 0 1 0 1 1  1  0  1  0  1  1  1  0  1  0  1

int main() {
	int n;
	cin>>n;
	// 1不是质数,标记为 1
	pri[1] = 1; 
	// 从2一直遍历到n
	for(int i=2;i<=n;i++){
		// 判断是不是质数
		if(pri[i] == 0){
			// 只标记当前质数i的倍数(从两倍开始)
			for(int j=i*2;j<=n;j+=i){
				pri[j] = 1; // 是合数,标记1
			}
		}
	}
	for(int i=2;i<=n;i++){
		if(pri[i] == 0) cout<<i<<" ";
	}
	return 0;
}

9 条评论

  • 1