/*8888888888888888888*/
#include <stdio.h>
#include <math.h>
#include <time.h>
#define C17 510510
#define SIZE 255255
char BaseCache[SIZE],WorkCache[SIZE];
int PRIMES [43000];
int LOWSQRT, HIGHSQRT; //起始位置和结束位置的平方根
void initCache(void)
{
int p,i;
for ( i = 0; i < SIZE ; i++ )
BaseCache[i] = 1;
for ( p = 3; p <= 17; p+=2 )
{
if ( p == 9 || p == 15 )
continue;
for ( i = p >> 1; i < SIZE; i+=p )
BaseCache[i] = 0;
}
}
void firstSieve(void)
{
int p,i,j,delta = 36,cigema = 180;
for ( i = 0; i < SIZE; i++ )
WorkCache[i] = BaseCache[i];
LOWSQRT = (int)sqrt(C17-1);
for ( p = 19; p <= LOWSQRT; p+=2 )
{
if (WorkCache[p >> 1])
for ( j = cigema; j < SIZE; j+=p )
WorkCache[j] = 0;
delta += 4;
cigema += delta;
}
WorkCache[1] = 1;
WorkCache[2] = 1;
WorkCache[3] = 1;
WorkCache[5] = 1;
WorkCache[6] = 1;
WorkCache[8] = 1;
j = 1; PRIMES[j] = 2;
for (i = 1; i < SIZE; i++)
if (WorkCache[i])
PRIMES[++j] = (i << 1) + 1;
PRIMES[0] = j;
}
void __fastcall nextSieve(int beg, int end)
{
int p,i,j,k;
HIGHSQRT = (int)sqrt(end);
for ( i = 0; i < SIZE; i++ )
WorkCache[i] = BaseCache[i];
i = 8; p = 19;
while ( p <= LOWSQRT )
{
j = beg % p;
if (j != 0)
{
j = beg + p - j;
if (j % 2 == 0) j+=p;
} else j = beg;
j = (j - beg + 1) >> 1;
for ( k = j; k < SIZE; k+=p )
WorkCache[k] = 0;
p = PRIMES[++i];
}
while ( p <= HIGHSQRT )
{
j = (p * p - beg + 1) >> 1;
for ( k = j; k < SIZE; k+=p )
WorkCache[k] = 0;
p = PRIMES[++i];
}
LOWSQRT = HIGHSQRT;
}
int __fastcall PrimeCount(int len)
{
int c = 0,i;
for ( i = 0; i < len; i++ )
if (WorkCache[i]) c++;
return c;
}
int main()
{
int c,i,j,k;
clock_t t1 = clock(),t2;
initCache();
firstSieve();
c = PRIMES[0];
int beg = C17 + 1,end = (C17 << 1) - 1;
while ( end < 100000000 )
{
nextSieve(beg,end);
c += PrimeCount(SIZE);
beg += C17; end += C17;
}
end = 99999999;
nextSieve(beg,end);
c += PrimeCount((end - beg)>>1);
t2 = clock();
printf("--> time : %d\n",t2-t1);
printf("Prime Count: %d\n",c);
return 0;
}