Cod sursa(job #1761871)

Utilizator CaterpillerLeaf Caterpiller Caterpiller Data 23 septembrie 2016 00:11:02
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

class Sieve
{
    int mSize;
    bool* pSieve;
public:
    Sieve(int max_value)
    {
        mSize = max_value + 1;
        pSieve = new bool[mSize];
        for (int i = 0; i < mSize; ++i) pSieve[i] = true;
        pSieve[0] = false;
        pSieve[1] = false;
        for (int i = 2; i*i <= max_value; ++i) {
            if (pSieve[i]) {
                for (int j = i*i; j <= max_value; j += i) pSieve[j] = false;
            }
        }

    }
    ~Sieve()
    {
        mSize = 0;
        delete[] pSieve;
    }
    bool isPrime(int x)
    {
        if (0 <= x && x < mSize) return pSieve[x];
    }
    int countPrimesUpTo(int x)
    {
        if (x >= mSize) return -1;
        if (x <= 1) return 0;
        int n_primes = 1;
        for (int i = 3; i <= x; i += 2) {
            if(pSieve[i]) ++n_primes;
        }
        return n_primes;
    }

};

int main()
{
    std::ifstream input("ciur.in");
    std::ofstream output("ciur.out");
    int n;

    input >> n;
    Sieve sieve(n);
    output << sieve.countPrimesUpTo(n) << '\n';
}