#include <stdio.h> #include <windows.h> #define MAXSIZE 333332 #define DELETED 1 #define KEPT 0 int main(void) { int sieve[MAXSIZE+1]; int count = 2; int prime; int i,k; DWORD TimeStart=0,TimeStop=0; double TotalTime; TimeStart = GetTickCount(); printf("/nEratosthenes Sieve Method"); printf("/n========================="); printf("/n/nPrime Numbers between 2 and %d/n", MAXSIZE*3+4); for (i = 0; i <= MAXSIZE; i++) /* set all items to be*/ sieve[i] = KEPT; /* kept in the sieve */ //sieve[0] = 5;偶数对应3n+5 //sieve[1] = 7;奇数对应3n+4 for (i = 0; i <= MAXSIZE; ++i) { if (KEPT == sieve[i]) { if (i %2 == 0) { prime = 6 * i + 10; count++; for (k = prime + i; k <= MAXSIZE;k += prime) sieve[k] = DELETED; for (k = 5*i+7;k <= MAXSIZE;k += prime) sieve[k] = DELETED; } else { prime = 6 * i + 8; count++; for (k = prime + i; k <= MAXSIZE; k += prime) sieve[k] = DELETED; for (k = 5 * i + 5; k <= MAXSIZE; k += prime) sieve[k] = DELETED; } } } printf("/n%6d%6d",2,3); for ( i = 0,k = 3; i <= MAXSIZE;++i) { if (KEPT == sieve[i]) { if (k > 10) { printf("/n"); k = 1; } if (i % 2 == 0) printf("%6d",3 * i + 5); else printf("%6d",3*i +4); k++; } } TimeStop = GetTickCount(); TotalTime = (double)(TimeStop - TimeStart) / 1000.0; printf("/n/nThere are %d primes in total.", count); printf("/nTotal Time : %.4f seconds/n",TotalTime); return 0; }