数论学习笔记:素数筛
关于求素数的,如果只需要求一个素数,可以直接根据定义求。如果是求一个范围内的多个素数,就需要用到素数筛了,常用素数筛就是欧拉筛。
一、素数筛(欧拉筛)
所谓素数筛就是求出小于等于n的所有素数的一个数论方法,常用的素数筛就是欧拉筛,欧拉筛的时间性能和空间性能都十分友好,时间复杂度为O(n),空间复杂度也为O(n)。
二、板子
之前学的时候经常用的板子,太久没复习忘光光了,这里做个记录,就当复习了~
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
bool isprime[1000100]; //记录i是不是素数的数组
vector<int> prime; //用来记录素数
void oula(int n){
/*memset可以赋值 0(int型)或者 true和false(bool型),不能赋值 1*/
memset(isprime,true,sizeof(isprime)); //初始情况下全部都为素数
for(int i=2;i<=n;i++){
if(isprime[i]) prime.push_back(i);//如果数i没有被筛法筛掉,说明它是素数
for(int j=0;j<prime.size()&&i*prime[j]<=n;j++){
isprime[i*prime[j]]=false; //这个数是一个素数的i倍,所以将它筛掉,不是素数
if(i%prime[j]==0) break; //神之一笔,就是这个判断让素数筛复杂度变为O(n)
}
}
}
signed main(){
int n;
cin>>n;
oula(n);
cout<<prime.size();
}
三、基础例题
这里主要节选自晴问算法网站,拜谢晴神的《算法笔记》!!
T1--打印素数表
T2--素数个数
T3--最大素数
T4--最小素数
可以直接套板子,小改即可!
四、真题
这里介绍一个蓝桥杯真题,晚点会给真题链接和题解链接。
0双子数 - 蓝桥云课(真题链接)
双子数题解(蓝桥杯)-CSDN博客(题解链接)