Cod sursa(job #1099230)

Utilizator mariusmagureanmagurean marius mariusmagurean Data 5 februarie 2014 17:58:40
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
/*
Ciurul lui Eratostene.
Aceasta metoda determina numerele prime cuprinse intre 2 si n (sa zicem ca n ar putea fi pana la 2 000 000)
Folosim un vector  caracteristic, cu definitia v[i]=0, i este prim, 1 contrar
Marcam fiecare din multiplii lui 2, 3, 5, 7 etc, adica a numereler prime cu 1 (ei nu vor fi numere prime)
Astfel cernem numerele neprime prin sita si in final vor ramane doar numerele prime (v[i]=0)

Numaram cate numere prime sunt intre 2 si n
*/

#include<fstream>
#include<vector>

using namespace std;

int main()
{
    ifstream fin("ciur.in");
    ofstream fout("ciur.out");
    int n,i,j,cate=0;
    fin>>n;
    vector<int>v(n);
    //numerele pare in afara de 2 nu sunt prime, le marcam direct
    v[0]=1, v[1]=1;//0 si 1 nu sunt prime
    for(i=4;i<=n;i+=2)
        v[i]=1;
    //parcurgem apoi doar numerele impare si marcam multiplii lor. Pentru a evita marcarea elem pare inca o data vom marca multiplii din i*i
    //nu marcam din i,3i,5i, deoarece s-au marcat anterior si prin urmare vom merge din i*i.
    //cu i mergem doar pana la sqrt(n)

    for(i=2;i*i<=n;i++)
        if(v[i]==0)
            for(j=3*i;j<=n;j=j+2*i)
                v[j]=1;
    for(i=2;i<=n;i++)
        if(v[i]==0)
        {
            cate++;
        }
    fout<<cate;
    return 0;
}