Cod sursa(job #875165)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 9 februarie 2013 19:24:51
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <bitset>
#include <cmath>
 
using namespace std;

//Astfel ciurul va fi pe biti, stimulul de viteza fiind considerabil (1 reprezentand
//un numar neprim si 0 un numar prim)
bitset <2000005> v;

int main()
{
    //Deschiderea fisierelor de intrare si iesire
    ifstream fin("ciur.in");
    ofstream fout("ciur.out");
 
    //n - numarul pana la care trebuie facut ciurul
    int n;
    
    //i,j - contoare si nr - numarul de numare prime, care initial este 1 deoarece
    //2 este singurul numar prim par si nu va mai fi analizat impreuna 
    //cu restul numerelor
    int i,j,nr=1;
 
    //Citim n
    fin>>n;
    
    //Limita pana la care vor fi parcurse numerele de la care pleaca marcarea
    int limita=sqrt(n); //Radicalul se poate implementa si de mana, prin cautarea
                        //binara a rezultatului
 
    //Marcam numerele pare
    for(i=4;i<=n;i+=2)
        v[i]=1;
 
    //Marcam restul numerelor compuse
    for(i=3;i<=limita;i+=2)
        if(v[i]==0)
        {
            //Consemnam faptul ca numarul este prim
            nr++;
             
            //Ii marcam multiplii
            for(j=i*i;j<=n;j+=i)
                v[j]=1;
        }
  
    //Parcurgem restul de numere de la limita pana la n fara a mai marca multiplii,
    //acest lucru nefiind necesar
    for(;i<=n;i+=2)
        if(v[i]==0)
           nr++;
 
    //Afisam raspunsul
    fout<<nr<<'\n';
    
    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;