- 分享
试除法判断质数
- @ 2024-10-4 23:20:13
因本人在(10月4日T3)被判断质数暴虐后便决定将判断质数所有办法全列举出来:
1.死亡暴力枚举:
bool is_prime(int n){
if (n < 2) return false;
for (int i = 2; i <= n; i++)
if (n % i == 0) return false;
return true;
}
绝对不要用此方法!!真的!!
时间复杂度O(N*N);
2.朴素算法:
bool is_prime(int n){
if (n < 2) return false;
for (int i = 2; i <= n/i; i++)
if (n % i == 0) return false;
return true;
}
最好别用,除非数字小
时间复杂度O(N*√N);
3.普通筛法:
int primes[N], cnt;
void get_prime(int n){
for(int i = 2; i <= n; i ++){
for(int j = i + i; j <= n; j += i) st[j] = true;
}
}
可以解决80%的题了
时间复杂度O(n*logn)
4.埃式筛法:
bool st[N];
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (st[i]) continue;
for (int j = i + i; j <= n; j += i)
st[j] = true;
}
}
可以解决95%的题了
时间复杂度O(nlog(logn))(本人大力推荐)
5.欧拉筛法(线性筛):
int primes[N], cnt;
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
for (int j = 0; primes[j] * i <= n; j ++ ) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
可以解决99.999999%的题了
时间复杂度O(n)(较难理解)
0 条评论
目前还没有评论...