Project Euler Problem 10
阿新 • • 發佈:2018-11-11
Problem 10 : Summation of primes
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
#include <iostream>
#include <cstring> // memset()
#include <ctime> // clock()
#include <cmath> // sqrt()
#include <cassert> // assert()
using namespace std;
class PE0010
{
private:
static const int m_MAX = 2000000; // two million
bool *m_Sieve; // Prime Sieve
public:
PE0010() { m_Sieve = new bool [m_MAX+1]; }
~PE0010() { delete [] m_Sieve; }
void createPrimeSieve();
long long getSumOfPrimes(int number = m_MAX) ;
};
// create a prime Sieve of Eratosthenes below max value
void PE0010::createPrimeSieve()
{
memset(m_Sieve, true, (m_MAX+1)*sizeof(bool));
m_Sieve[0] = m_Sieve[1] = false;
for (int i=2; i<=(int)sqrt((double)m_MAX); i++)
{
if (true == m_Sieve[i])
{
for (int j=i*i; j<m_MAX; j+=i)
{
m_Sieve[j] = false;
}
}
}
}
// calculate sum of all primes below number
long long PE0010::getSumOfPrimes(int number)
{
long long sum = 2; // first prime prime is 2
for (int n=3; n<number; n+=2) // primes above 2 are odd
{
if (true == m_Sieve[n])
{
sum += n;
}
}
return sum;
}
int main()
{
clock_t start = clock();
PE0010 pe0010;
pe0010.createPrimeSieve();
assert(17 == pe0010.getSumOfPrimes(10));
cout << "The sum of all the primes below two million is " ;
cout << pe0010.getSumOfPrimes() << endl;
clock_t finish = clock();
double duration=(double)(finish - start) / CLOCKS_PER_SEC;
cout << "C/C++ application running time: " << duration << " seconds" << endl;
return 0;
}