Pagini recente » Monitorul de evaluare | Cod sursa (job #1075863) | Cod sursa (job #2976370) | Cod sursa (job #610490) | Cod sursa (job #1099236)
/*
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)
Folosim char in loc int pentru ca o comp se retine pe mai putina memorie
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;
char v[n+2];
//numerele pare in afara de 2 nu sunt prime, le marcam direct
v[0]='1', v[1]='1';//0 si 1 nu sunt prime
//vectorul nu este initializat si trebuie marcate toate componentele ca fiind 0
for(i=2;i<=n;i++)
v[i]='0';
//sirul trebuie inchis cu caracterul final sir
v[n+1]='\0';
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;
}