#include 

#include 

#include 

#define MAX_INT (unsigned long)(pow(2, 25))

#define MY_DEBUG 0

int main()

    {

     clock_t start_clock, end_clock;

     unsigned long i, j, k, odd_greater_than_1, n, up_bound = MAX_INT;

     unsigned char *prime_map;

     start_clock = clock();

     odd_greater_than_1 = (up_bound - 1) / 2;

    

     prime_map = new unsigned char[odd_greater_than_1];

     for (i = 0; i < odd_greater_than_1; i++)

     prime_map[i] = 1;

     n = unsigned long((sqrt(up_bound) - 3) / 2.0);

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

         {

         if (prime_map[i] == 1)

             {

             k = 2 * i + 3; // new prime

             for (j = 2 * i * (i + 3) + 3; j < odd_greater_than_1; j = j + k)

                 {

                 prime_map[j] = 0;

                 }

                 }

                 }

                 end_clock = clock();

                 if (MY_DEBUG)

                     {

                     cout << setw(10) << 2;

                     for (j = 0; j < odd_greater_than_1; j++)

                         {

                         if (prime_map[j] == 1)

                             {

                             cout << setw(20) << 2 * j + 3;

                             }

                             }

                             cout << endl;

                             }

                             delete [] prime_map;

                             cout << "Total time to get list: " << end_clock - start_clock << " ms" << endl;

                             return 0;

                        }