素数大酬宾-筛选法

筛选法

筛选法又称为筛法,相比穷举法,筛选法的效率更高

以求1~20之内的素数为例,具体步骤如下:

  1. 将所有的数(2~n)放入"筛子"中,把1删除
  2. 2在筛中,将2的倍数2,4,,...20删除(筛去);
  3. 3在筛中,将3的倍数6,9,..18删除(筛去);
  4. 4不在筛子,不执行删除(筛去)操作;
  5. ......
  6. 10不在筛中,不执行删除(删去)操作
  7. 因为20以内最大的因子就是10,所以不用再筛大于10的数了,只要筛到√20即可
#include <bits/stdc++.h>  // 包含了C++的所有标准库,是一个常用的头文件集合  
using namespace std;       // 使用命名空间std,使得我们不需要在每次使用标准库函数时都写std::  
  
int main(){  // 程序的主入口点  
  
	int n,i,j;  // 声明了三个整型变量n, i, j  
	bool p[100001];  // 声明了一个布尔型数组p,长度为100001  
  
	for(i=0;i<=100000;i++){  // 初始化数组p,将数组中的每个元素都设为true  
		p[i] = true;  
	}   
	p[1] = false;  // 将数组p的第一个元素设为false,因为1不是质数  
  
	cin >> n;  // 从标准输入读取一个整数n  
	cout << 2;  // 输出2,可能是为了测试输出是否正确或者为了占位  
  
	// 通过检查每个小于等于sqrt(n)的质数i,将所有i的倍数都标记为非质数  
	for(i = 2;i<=sqrt(n);i++){  // i从2开始到n的平方根  
		if(p[i]){  // 如果i是质数(由前面的初始化以及判断得到)  
			for(j=2;i*j <=n;j++){  // 对于每个质数i,将所有i的倍数都标记为非质数  
				p[i*j] = false;  
 			}  
 		}  
	}  
  
	// 输出所有未被标记为非质数的数字,这些数字就是小于等于n的所有质数  
 	for(i = 3;i<=n;i++){  // i从3开始到n  
 		if(p[i]){  // 如果i是质数(由前面的标记得到)  
 			cout <<" " << i;  // 输出i  
 		}  
 	}  
 	cout << endl;  // 输出换行符,使得输出结果更加整齐  
 	return 0;  // 主函数返回0,表示程序正常结束  
}

摘抄自:信息学奥赛-课课通(C++)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值