Cod sursa(job #1042801)

Utilizator Nicusor002Telechi Nicolae Nicusor002 Data 27 noiembrie 2013 18:15:41
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>

#define EratostenesMaxN 2000000
class Eratostenes{
    int nrPrimes;
    unsigned char v[((EratostenesMaxN>>4)+1)];
public:
    Eratostenes(int n) : nrPrimes((n+1)/2){
        int i,j;

        for(i=3;i*i<=n;i+=2){
            if(v[i>>4]&(1<<((i>>1)&7)))
                continue;
            for(j=i*3;j<=n;j+=i+i){
                if(!(v[j>>4]&(1<<((j>>1)&7))))
                    nrPrimes--;
                v[j>>4]|=(1<<((j>>1)&7));
            }
        }
        nrPrimes=nrPrimes;
    }
    ~Eratostenes(){
        delete[] v;
    }

    int getNrPrimes(){
        return nrPrimes;
    }
};

int main(){
    int n;
    freopen("ciur.in","r",stdin);
    freopen("ciur.out","w",stdout);

    scanf("%d",&n);

    Eratostenes ciur(n);

    printf("%d",ciur.getNrPrimes());
    return 0;
}