#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
#include <cmath>
using namespace std;
typedef uint32_t uint;
//////////////////////////////////////////////////////////////////////////////
struct Task
{ uint result;
Task(uint n) : result(0)
{ for(uint i = 1; i < n; i +=2)
if(is_simple(i))
result++;
}
bool is_simple(uint n)
{ for(uint i = 3; i <= sqrt(n); i +=2)
if(n%i == 0)
return false;
return true;
}
};
//////////////////////////////////////////////////////////////////////////////
uint32_t primes(uint max_number)
{ vector<uint> primes = {2};
for(uint i = 3; i < max_number; i += 2)
{ auto last = std::upper_bound(primes.begin(),
primes.end (),
uint(sqrt(i)));
for(auto it = primes.begin();
it != last;
++it )
{ if (i % (*it) == 0) goto next;
}
primes.push_back(i);
next: ;
}
return primes.size();
}
//////////////////////////////////////////////////////////////////////////////
uint primes2(uint max_number)
{ vector<uint> primes;
for(uint i = 2; i <= max_number; i++)
{ auto max = uint(sqrt(i));
for(auto &prime : primes)
{ if(prime > max) break;
if(i % prime == 0) goto next;
}
primes.push_back(i);
next: ;
}
return primes.size();
}
//////////////////////////////////////////////////////////////////////////////
#define TIMER_START auto s = chrono::high_resolution_clock::now()
#define TIMER_END auto t = chrono::high_resolution_clock::now() - s;
#define TIMER_LOG(v) cout << v << " "\
<< chrono::duration<double, milli>(t).count() << "\n"
const uint NUMBER = 5000000;
void test(uint (*fn)(uint))
{ TIMER_START;
auto count = fn(NUMBER);
TIMER_END;
TIMER_LOG(count);
}
void test()
{ TIMER_START;
Task my(NUMBER);
TIMER_END;
TIMER_LOG(my.result);
}
//////////////////////////////////////////////////////////////////////////////
int main()
{ cout << "primes 1: ";
test(primes);
cout << "primes 2: ";
test(primes2);
cout << "my : ";
test();
}