筛选法
筛选法又称为筛法,相比穷举法,筛选法的效率更高
以求1~20之内的素数为例,具体步骤如下:
- 将所有的数(2~n)放入"筛子"中,把1删除
- 2在筛中,将2的倍数2,4,,...20删除(筛去);
- 3在筛中,将3的倍数6,9,..18删除(筛去);
- 4不在筛子,不执行删除(筛去)操作;
- ......
- 10不在筛中,不执行删除(删去)操作
- 因为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++)