Cod sursa(job #606638)

Utilizator Lokycatalin petre Loky Data 6 august 2011 14:26:53
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <cmath>

using namespace std;

long int v[2100000],i,n,x,s,nr;

bool prim(int nr)
{
    bool ok;
    int i,x;
    ok=true;
    x=trunc(sqrt(nr));
    for (i=2;i<=x;i++) {
        if (nr%i==0) ok=false;
        if (ok==false) break;
    }
    return(ok);
}

int main()
{
    ifstream f("ciur.in");
    ofstream g("ciur.out");
    f>>n;
    x=2;
    while (x<n) {
        x=x+2;
        v[x]=1;
    }
    x=3;
    while (x*x<=n) {
        if (prim(x)) {
            s=x;
            while (s<n) {
                s=s+x*2;
                v[s]=1;
            }
        }
    x=x+2;
    }

    nr=0;
    for (i=2;i<=n;i++)
    if (v[i]==0) nr++;
    g<<nr;

    f.close();
    g.close();
    return 0;
}

//luam un vector cu toate valorile 0
//il luam pe 2 si punem 1 la toti multiplii lui mai mici ca n;
//luam toate numerele prime <=radical din n si punem 1 la toti multiplii lor impari,la cei pari e deja 1;
//numaram cati de 0 au mai ramas in vector de la 2 la n si ala e rezultatul