求素数(质数)的方法及时间复杂度的比较

素数,又叫质数,定义是除了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)

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值