Pagini recente » Cod sursa (job #733286) | Cod sursa (job #387177) | Cod sursa (job #1959345) | Cod sursa (job #1436823) | Cod sursa (job #1506384)
#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;
}