#include <iostream>
#include <list>         // from stackoverflow.com/q/55022028/849891
#include <cmath>       //      by stackoverflow.com/users/9434763/apoorva-raju
#include <ctime>      // tweaked by stackoverflow.com/users/849891/will-ness
using namespace std;    
/*  
check_prime__list:

          time taken       No of divisions         No of primes
10M:    0.873 seconds        286144936                664579
20M:    2.169 seconds        721544444               1270607
                 (2.5x)          (2.5x)    (log 2.5 / log 2 = 1.32)
                                       (2B: over 2.169*100**1.32/60 = 16 minutes)
check_prime__nums:

          time taken       No of divisions         No of primes
10M:    4.650 seconds       1746210131                664579
20M:   12.585 seconds       4677014576               1270607
                 (2.7x)          (2.7x)    (log 2.7 / log 2 = 1.43)
                                       (2B: over 12.585*100**1.43/3600 = 2.5 hours)
*/

list<long long> primeno;
long int noofdiv = 0;      /// LONG!!!! was wrapping-around with INT, #@%$&$#
void ListPrimeNumber();
int no_primes = 3;

int main()
{
    clock_t time_req = clock();
    ListPrimeNumber();
    time_req = clock() - time_req;
    cout << "\ntime taken " << static_cast<float>(time_req) / CLOCKS_PER_SEC << " seconds";
    cout << "\nNo of divisions : " << noofdiv;
    cout << "\nNo of primes : " << no_primes;
    return 0;
}

void check_prime(int i);

void ListPrimeNumber()
{
    primeno.push_back(2);
    primeno.push_back(3);
    primeno.push_back(5);
    for (long long i = 6; i <= 10000000; i++)
    {
        check_prime(i);
    }

}

void check_prime(int i)   // __list
{
    try
    {
        int limit = sqrt(i);
        for (int iter : primeno)
        {
            if (iter > limit)
            {
                primeno.push_back(i);
                ++no_primes;
                break;
            }
            else if ( (++noofdiv , (i % iter) == 0) )
            {
                break;
            }
        }
    }

    catch (exception ex)
    {
        std::cout << "Message";
    }
}

void check_prime__nums(int i)
{
    try
    {
        int j = 0;
        int limit = sqrt(i);
        for (j = 2 ; j <= limit;j++)
        {
            if(  (++noofdiv , (i % j) == 0) )
            {
                break;
            }
        }
        if( j > limit)
        {
            primeno.push_back(i);
            ++no_primes;
        }
    }

    catch (exception ex)
    {
        std::cout << "Message";
    }
}