打更大范围素数表


因为OJ经常限制内存大小,因而采用位图的思想。用二进制存取一个数是否是一个素数


然后偶数直接判断然后舍去掉。。这样节省了一半的内存。。

因而一个 3711111的数组,可以得到 10的9次方表

#include 
#include 
#include 
using namespace std;
const int N = 3711111;
unsigned check[N];
vector prm;
void rm(int u){
    u >>=1;
    check[u/32] |= 1<<(u%32);
}
bool exis(int u){
    u >>=1;
    return !(check[u/32]&(1<<(u%32)));
}
void bitPrm(int n){
    prm.push_back(2);
    int i;
    for(i=3;i * i < n;i+=2){
        if(exis(i)){
            prm.push_back(i);
            for(long long j = (long long)i*i; j < n;j+=i){
                if(j&1)
                    rm(j);
            }
        }
    }
    for( ; i < n; i+=2) if(exis(i)) prm.push_back(i);
}
bool is_prm(int u){
    if(u>2&&(u&1)==0) return false;
    return u>1&&exis(u);
}
int main(){
    bitPrm(100);
    for(int i=0;i<100;i++){
        printf("%d\n",prm[i]);
    }
    for(int i=0;i<100;i++){
        if(is_prm(i)) printf("%d\n",i);
    }
    return 0;
}


#include 
#include 
#include 
using namespace std;
const int N = 7511111;
unsigned check[N];
vector prm;
void rm(int u){
    check[u/32] |= 1<<(u%32);
}
bool exis(int u){
    return !(check[u/32]&(1<<(u%32)));
}
void bitPrm(int n){
    prm.push_back(2);
    for(int i=4;i < n;i+=2) rm(i);
    for(int i=3;i < n;i+=2){
        if(exis(i)){
            prm.push_back(i);
            for(long long j = (long long)i*i; j < n;j+=i){
                rm(j);
            }
        }
    }
}
int main(){
    bitPrm(111111111);
    for(int i=0;i<6;i++){
        printf("%d\n",prm[i]);
    }
    return 0;
}


你可能感兴趣的:(素数表,数论,ACM)