Problem 7

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

#define NUM 10001
#define DST 100

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 num = 0;
    for (vector<bool>::size_type i = 0; i < pv_table->size(); i++)
    {
        if(pv_table->at(i))
        {
            num++;
        }
        else
        {
        }
    }    
    
    if (num < NUM)
    {
        findPrime(pv_table);
        return num;
    }
    else
    {
        return num;
    }
}

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

    findPrime(&v_table);

    int count = 1;
    for (vector<bool>::size_type i = 0, end = v_table.size(); i < end; i++)
    {
        if(v_table[i])
        {
            if (count++ == NUM)
                cout << i << endl;
        }
    }

    return 0;
}