Eratosthens sieve



#include <iostream>
#include <set>

using namespace std;

#include "IO.hpp"

void SIEVE(set<int>& primes,int limit){

int index;

primes.erase(primes.begin(),primes.end());

for(int i=2;i<limit;i++)
primes.insert(i);

for(int i=2;i*i<=limit;i++)
if(primes.find(i) != primes.end()){

index = 2*i;
while(index <= limit){
primes.erase(index);
index += i;
}
}

return;
}

int main(int argc,char *argv[])
{
set<int> primeSet;

set<int>::iterator iter;
int primeLimit,count=0;

cout<<"Enter upper limit for the set of primes: ";
cin>>primeLimit;
cout<<endl;

SIEVE(primeSet,primeLimit);

iter= primeSet.begin();

writeContainer(primeSet.begin(),primeSet.end()," ",10);

cout<<endl;

return 0;
}




#ifndef _IO_HPP_
#define _IO_HPP_

#include <vector>
#include <set>
#include <list>

using namespace std;

//LINE=0 不需换行
//separator 表示每个元素间隔符号
//N为元素个数

//writeArray (arr[], N:, separator, LINE)
//writeContainer (begin(), end(), separator, LINE)
//writeVector (vector<T>, separator, LINE)
//writeList (list<T>, separator, LINE)
//writeSet (set<T>, separator, LINE)


template <typename T>
void writeArray(const T arr[], \
int N, \
const char* separator, \
int LINE){

for(int i=0;i<N;i++){

cout<<arr[i]<<separator;

if(LINE!=0)
if(i%LINE==0)
cout<<endl;
}
cout<<endl;

return;
}

template <typename T>
void writeVector(const vector<T>& v, \
const char* separator, \
int LINE){

int i, n = v.size();

for(i=0;i<n;i++){

cout<<v[i]<<separator;

if(LINE!=0)
if(i%LINE==0)
cout<<endl;
}
cout<<endl;

return;
}

template <typename T>
void writeList(const list<T>& alist, \
const char* separator, \
int LINE){

typename list<T>::const_iterator iter;

int count = 0;
iter = alist.begin();

while(iter != alist.end()){

count++;
cout<<*iter<<separator;

if(LINE!=0)
if(count%LINE==0)
cout<<endl;

iter++;
}
cout<<endl;

return;
}

template <typename T>
void writeSet(const set<T>& alist, \
const char* separator, \
int LINE){

typename set<T>::const_iterator iter;

int count = 0;
iter = alist.begin();

while(iter != alist.end()){

count++;
cout<<*iter<<separator;

if(LINE!=0)
if(count%LINE==0)
cout<<endl;

iter++;
}
cout<<endl;

return;
}

template <typename Iterator>
void writeContainer(Iterator begin, \
Iterator end, \
const char* separator, \
int LINE){

Iterator iter = begin;
int count = 0;

while (iter!=end){

count++;
cout<<*iter<<separator;

if(LINE!=0)
if(count%LINE==0)
cout<<endl;

iter++;
}
cout<<endl;

return;
}

#endif




这个筛实现很简单, 比如上限是300 就把300以内所有小于sqrt(300)质数的倍数划掉就行, 我这里划了小于sqrt(300)所有数的倍数, 因为要划小于sqrt(300)的质数必须先生成, 用两此筛就行

比如筛10000以内 先生成100以内的质数 然后划掉100以内的质数就可以,不用划100个数字,会节约点时间


按照SPOJ上的提示,用筛法,二次筛 都无法通过SPOJ第二题, 都是超时.
或许我筛法写得性能不好 像set容器 性能可能确实有问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值