class CPrimeSet
{
public:
CPrimeSet(unsigned uMax=0x0000FFFF);
virtual ~CPrimeSet();
bool IsPrime(unsigned uNum);
private:
static unsigned m_uCnt, m_uMax;
static bool *m_pbPrime;
};
unsigned CPrimeSet::m_uCnt=0, CPrimeSet::m_uMax=0;
bool *CPrimeSet::m_pbPrime=NULL;
CPrimeSet::CPrimeSet(unsigned uMax/* =0x0000FFFF */)
{
m_uCnt++;
if (uMax>m_uMax)
{
unsigned uSize=(uMax>>1)+1;
m_uMax=uMax;
if (m_pbPrime!=NULL) delete[] m_pbPrime;
m_pbPrime=new bool[uSize];
memset(m_pbPrime, true, uSize);
m_pbPrime[0]=false;
for (unsigned i=3; i*i<=uMax; i+=2)
{
if (m_pbPrime[i>>1])
{
unsigned k=i<<1;
for (unsigned j=i*i; j<=uMax; j+=k) m_pbPrime[j>>1]=false;
}
}
}
}
CPrimeSet::~CPrimeSet()
{
if (--m_uCnt==0) delete[] m_pbPrime;
}
bool CPrimeSet::IsPrime(unsigned uNum)
{
if (uNum==2) return true;
if ((uNum&1)==0) return false;
return m_pbPrime[uNum>>1];
}
简单版
void InitPrime(bool bPrime[], int nMax)
{
memset(bPrime, true, (nMax+1)*sizeof(bool));
bPrime[0]=bPrime[1]=false;
for (int i=4; i<=nMax; i+=2) bPrime[i]=false;
for (int i=3; i*i<=nMax; i+=2)
{
if (bPrime[i])
{
int k=i<<1;
for (int j=i*i; j<=nMax; j+=k) bPrime[j]=false;
}
}
}