Cod sursa(job #1506384)

Utilizator teodorgTeodor G teodorg Data 20 octombrie 2015 16:27:50
Problema Ciurul lui Eratosthenes Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;
ifstream f("ciur.in");
ofstream g("ciur.out");
int n,cnt,i,j;
short int M[2000010];
int main()
{
    //citim n
    f>>n;
    //daca n>=2 il numaram pe 2
    if(n>=2)cnt++;
    //parcurgem numerele i impare incepand cu 3 din 2 in doi pana avem i*i>n
    for(i=3;i*i<=n;i=i+2)
        //daca gasim marcajul 0 atunci am gasit un numar prim nou
        if(M[i]==0)
        {
            //numaram acest numar prim
            cnt++;
            //apoi incepand cu i*i mergem din i in i pana la n parcurgand astfel toti multiplii lui i si marcam acesti multipli
            for(j=i*i;j<=n;j=j+i)
                M[j]=1;
        }
    //acum i a ajuns la prima valoare care la patrat depaseste n
    //incepand cu aceasta valoare i ar marca numai valori mai mari ca n deci nu mai marcam nimic.
    //din acest moment parcurgem valorile impare ramase incepand de la valoarea la care a ramas i din 2 in 2
    for(;i<=n;i=i+2)
        //daca gasim valoare nemarcata
        if(M[i]==0)
            //inseamna ca am gasit un nou numar prim deci vom numara si acest numar prim
            cnt++;
    //la final afisam contorul cnt
    g<<cnt;
    return 0;
}