Cod sursa(job #878066)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 februarie 2013 21:27:01
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <bitset>
#include <cmath>

using namespace std;

//Ciurul se va face pe biti
bitset <2000005> v;

int main()
{
    //Deschiderea fisierelor de intrare si ieisre
    ifstream fin("ciur.in");
    ofstream fout("ciur.out");

    //Numarul pana la care cautam numerele prime
    int n;

    //i,j - contoare si nr - numarul de numere prime gasite (este initial 1 caci 2 este singurul numar prim si par)
    int i,j,nr=1;

    //Se citeste n
    fin>>n;

    //Limita superioara a parcurgerii pentru marcarea multiplilor
    int limita=sqrt(n);

    //Se marcheaza numerele pare
    for(i=4;i<=n;i+=2)
        v[i]=1;

    //Se aplica algoritmul Ciurului lui Eratostenes
    for(i=3;i<=limita;i+=2)
        if(v[i]==0)
        {
            nr++;
            for(j=i*i;j<=n;j+=i)
                v[j]=1;
        }

    //Pentru restul de numere nu mai marcam multiplii dar crestem numarul de numere prime
    for(;i<=n;i+=2)
        if(v[i]==0)
           nr++;

    //Se afiseaza raspunsul
    fout<<nr<<'\n';

    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;
}