素数

判断是否为素数(一般方法):

时间复杂度O(sqrt(n))

//1
bool Find_prime(int n)
{
    if(n<=1) return false;//特判
    else{
        for(long long i=2;i*i<=n;i++){//开longlong防止i*i溢出 
            if(n%i==0) return false;
        }
        return true;
    } 
}

//2
bool Find_prime(int n)
{
    int m=sqrt(1.0*n);
    if(n<=1) return false;//特判
    for(int i=2;i<=m;i++){
        if(n%i==0) return false;
    }
    return true;
}
View Code

 

素数表的获取:

1.一般方法:范围在10^5内可以使用

时间复杂度:O(n loglogn)

const int MAX=100;
int prime[MAX],pNum=0;//pNum素数个数 
bool p[MAX]={0};//素数为true 
bool is_Prime(int n)
{
    if(n<=1) return false;//特判
    else{
        for(long long i=2;i*i<=n;i++){//开longlong防止i*i溢出 
            if(n%i==0) return false;
        }
        return true;
    } 
}
void find_prime(){
    for(int i=1;i<=MAX;i++){
        if(is_prime(i)==true){
            prime[pNum++]=i;
            p[i]=true;
        }
    }
}
View Code

2.筛法:

时间复杂度:O(n loglogn)

如果i为素数则i的倍数不为素数,前提是首先知道2为素数,因此第一次循环从2开始。表长至少要比n大1

const int MAX=101;//100内的素数 
int prime[MAX],pNum=0;//pNum素数个数 
bool p[MAX]={0};//素数为false
void Find_prime(){
    for(int i=2;i<MAX;i++){//不能写i<MAX 
        if(p[i]==false){
            prime[pNum++]=i;
            for(int j=i+i;i<MAX;j+=i){
                p[j]=true;
            }
        }    
    }
} 
View Code

 

posted @ 2022-04-13 20:43  顾南  阅读(197)  评论(0)    收藏  举报