#include "stdafx.h"
#include "tstPrimes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// The one and only application object
using namespace std;
void fastPrimes(DWORD uMin,DWORD uMax);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
fastPrimes(0,500);
return nRetCode;
}
//输入uMin~uMax之间的所有素数
void fastPrimes(DWORD uMin,DWORD uMax)
{
//快速求素数算法
// created by dingjianmin
//2012-01-11
DWORD ui=0;
DWORD u2=0;
DWORD uPrimes=0;
DWORD uMaxNum=uMax;
byte byPrime=0;
DWORD uPrimesSize=0;
DWORD uPrimesLen=0;
DWORD uSqrtVol=0;
unsigned long *pmPrimes=NULL;
uPrimesSize=(uMaxNum/100);
if(uMaxNum%100)
{
uPrimesSize++;
}
if(uMaxNum<500)
{
uPrimesSize*=25;
}
else
{
uPrimesSize*=19;
}
pmPrimes=new DWORD[uPrimesSize];
memset(pmPrimes,0,uPrimesSize);
for(ui=2;ui<=uMaxNum;++ui)
{
byPrime=0;
//uSqrtVol=(DWORD)sqrt(double(ui));
++uSqrtVol;
for(u2=0;u2<uPrimesLen;++u2)
{
if(!(ui%pmPrimes[u2]))
{
break;
}
if(pmPrimes[u2]*pmPrimes[u2]>ui)//(pmPrimes[u2]>uSqrtVol)
{
byPrime=1;
break;
}
}
if(byPrime || u2>=uPrimesLen)
{
//素数
pmPrimes[uPrimesLen++]=ui;
if(ui>=uMin)
{
printf(",%u",ui);
uPrimes++;
}
}
if(uPrimesLen>=uPrimesSize)
{
printf("\r\n=======ARRAY OVER============\r\n");
break;
}
}
if(ui>=uMaxNum)
{
printf("\r\n");
}
printf("count:%u\r\n",uPrimes);
}