Pagini recente » Cod sursa (job #2240628) | Cod sursa (job #2985269) | Cod sursa (job #2886078) | Monitorul de evaluare | Cod sursa (job #1099230)
/*
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)
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;
vector<int>v(n);
//numerele pare in afara de 2 nu sunt prime, le marcam direct
v[0]=1, v[1]=1;//0 si 1 nu sunt prime
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;
}