因为OJ经常限制内存大小,因而采用位图的思想。用二进制存取一个数是否是一个素数
然后偶数直接判断然后舍去掉。。这样节省了一半的内存。。
因而一个 3711111的数组,可以得到 10的9次方表
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 3711111;
unsigned check[N];
vector<int> 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 <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 7511111;
unsigned check[N];
vector<int> 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;
}