Cod sursa(job #1099236)

Utilizator mariusmagureanmagurean marius mariusmagurean Data 5 februarie 2014 18:05:02
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 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)
Folosim char in loc int pentru ca o comp se retine pe mai putina memorie
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;
    char v[n+2];
    //numerele pare in afara de 2 nu sunt prime, le marcam direct
    v[0]='1', v[1]='1';//0 si 1 nu sunt prime
    //vectorul nu este initializat si trebuie marcate toate componentele ca fiind 0
    for(i=2;i<=n;i++)
        v[i]='0';
    //sirul trebuie inchis cu caracterul final sir
    v[n+1]='\0';
    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;
}