素数,又叫质数,定义是除了1和它本身以外不再有其他的因数
时间复杂度O(n)
bool prime(int x){//判断x是不是质数,是返回true,不是返回false if(x<=1) return false; for(int i=2;i<x;i++) { if(x%i==0) return false; } return true; }
时间复杂度O(√n)
bool prime(int x){//判断x是不是质数,是返回true,不是返回false if(x<=1) return false; for(int i=2;i*i<=x;i++)//用乘法避免根号的精度误差 { if(x%i==0) return false; } return true; } //根据题目不同,如果i*i会爆int,要开longlong
根据题目所需,有时候需要先预处理出1~N这N个数是否是素数
埃氏筛法
原理:如果找到一个质数,那么这个质数的倍数都不是质数
比如2是质数,那么4,6,8,10,12...都不是质数
然后3是质数,那么6,9,12,15,18,21...都不是质数
然后是4,4已经被2标记为合数了,所以跳过
然后看5......这样一直筛下去
#include<iostream> #include<cstdio> #include<cstring> #define LL long long using namespace std; #define N 5000005 LL prime[N]; int cnt=1; bool bprime[N]; void make_prime() { memset(bprime,true,sizeof(bprime)); bprime[0]=false; bprime[1]=false; for(LL i=2;i*i<=N;i++) { if(bprime[i]) { prime[cnt++]=i; for(LL j=i*i;j<=N;j+=i) bprime[j]=false; } } } int main() { make_prime(); }
时间复杂度O(nloglogn)