Pagini recente » Cod sursa (job #2408519) | Cod sursa (job #938921) | Cod sursa (job #2908295) | Cod sursa (job #1484378) | Cod sursa (job #875171)
Cod sursa(job #875171)
#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;
}