质数筛(埃氏筛 欧拉筛)

#埃氏筛#

#include <bits/stdc++.h>
using namespace std;
//存储所有质数 
int ans[1000];
int isPrime[2000]; 
int main() {
	int n;
	cin >> n;
	int num = 1;
	for(int i=1; i<=n; i++) {
		isPrime[i] = 1;
	}
	for(int i=2; i<=n; i++){
		//如果是合数,那么continue 
		if(!isPrime[i]) {
			continue;
		}
		//如果是质数,那么存数组 
		ans[num++] = i;
		for(int j=i*2; j<=n; j+=i){
			//标志为合数 ,缺点 重复标记 
			isPrime[j] = 0;
		}
	}
	for(int i=1; i<num; i++) {
		cout << ans[i] << " ";
	} 
	
	return 0;
}

#欧拉筛#

#include <iostream>
#include <cstring>
using namespace std;
//存放所有的数字 
int allNum[2000];

//存放质数 
int prime[1000];
int primeNum = 1;
int main() {
	int n;
	cin >> n; 
	//先定义所有的数均为质数 
	memset(allNum, 1, sizeof(allNum));
	
	//0 和 1 不是质数 
	allNum[0] = allNum[1] = 0;
	//剔除合数(合数设置为0)
	for(int i=2; i<=n; i++) {
		//如果是质数,那么加入到质数表中,并剔除对应的合数
		if(allNum[i]) {
			prime[primeNum++] = i;
		} 
		
		//遍历质数列表,剔除对应的合数
		for(int j=1; j<primeNum && prime[j]*i<n; j++) {
			allNum[prime[j] * i] = 0;
			//如果遇到能被i整除的,那么直接break
			if(i%prime[j] == 0 && i!=j) {
				break;
			} 	
		} 
	} 
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值