// Written by Vasanth Raja Chittampally
// Source Code: Sieve of Eratosthenes
// All rights are reserved
#include <math.h>
#include <iostream>
#include <time.h>
void seive(int start, int range, int * primes)
{
//Seiving is done here
long start1 = clock();
for(int i = 6; i <= sqrt((float)range); i++)
{
int iter = 2 * i + 1;
if(primes[i] == 1)
{
int startInLoop = start / iter;
if(startInLoop % 2 == 0)
startInLoop++;
if(startInLoop < 13)
startInLoop = 13;
for(int j = startInLoop * iter; j <= range ; j += 2 * iter)
primes[(j - 1) / 2] = 0;
}
}
std::cout<<std::endl<<"Time for Seive of Eristhones: "<< (double)(clock()-start1) / CLOCKS_PER_SEC<<std::endl;
int count = 0;
// display the results
std::cout<<std::endl<<"Prime numbers with in the given range are"<<std::endl;
for(int i = start / 2; i <= range / 2; i++)
if(primes[i] != 0)
{
std::cout<< 2 * i + 1 << " ";
count++;
}
std::cout<<std::endl<< "Total number of primes between "<<start<<" and "<<range<<" are : " << count << std::endl;
}
int main(void)
{
int start;
int end;
std::cin>>start;
std::cin>>end;
int * primes = new int[end / 2 + 1];
long time1 = clock();
for(int i = 0; i <= end / 2; i++)
{
primes[i] = 1;
}
for(int i = 4; i <= end / 2; i += 3)
{
primes[i] = 0;
}
for(int i = 7; i <= end / 2; i += 5)
{
primes[i] = 0;
}
for(int i = 10; i <= end / 2; i += 7)
{
primes[i] = 0;
}
for(int i = 16; i <= end / 2; i += 11)
{
primes[i] = 0;
}
double totTime = (double)(clock() - time1) / CLOCKS_PER_SEC;
std:: cout << std::endl<<"Time for 2 3 5 7 11 : " <<totTime<< std::endl ;
seive(start, end, primes);
return 0;
}