Problem 10

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

#define NUM 2000000
#define DST 100000

void
primeVector(vector<bool> *pv_table)
{
    pv_table->at(0) = pv_table->at(1) = false;

    for (vector<bool>::size_type i = 2, end = (vector<bool>::size_type)ceil(sqrt((double)(pv_table->size()))); i < end; i++)
    {
        if (pv_table->at(i))
        {
            for (vector<bool>::size_type j = i+i, endJ = pv_table->size(); j < endJ; j+=i)
            {
                pv_table->at(j)  = false;
            }
        }
    }
}

int
findPrime(vector<bool> *pv_table)
{
    vector<bool>::size_type st = pv_table->size();
    pv_table->resize(st+DST);
    for (vector<bool>::size_type i = 0; i < DST; i++)
    {
        pv_table->at(st+i) = true;
    }
    
    primeVector(pv_table);

    int max = -1;
    for (vector<bool>::size_type i = pv_table->size()-1; i > 0; i--)
    {
        if(pv_table->at(i))
        {
            max = i;
            break;
        }
    }
    
    if (max < NUM)
    {
        findPrime(pv_table);
        return max;
    }
    else
    {
        return max;
    }
}

int
main(int argc, char ** argv)
{
    vector<bool> v_table, v_prime;

    findPrime(&v_table);

    long long sum = 0;
    for (vector<bool>::size_type i = 0, end = v_table.size(); i < end; i++)
    {
        if(v_table[i])
        {
            if (i > NUM)
            {
                break;
            }
            sum += i;
        }
    }

    cout << sum << endl;

    return 0;
}