Cod sursa(job #1806905)

Utilizator Teodor94Teodor Plop Teodor94 Data 15 noiembrie 2016 20:17:33
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
// http://www.infoarena.ro/problema/ciur
// Dandu-se un numar natural N, sa se determine numarul numerelor prime mai mici sau egale cu N.
// Ciurul lui Eratosthenes
// 2 ≤ N ≤ 2 000 000

// 2 3 -4 5 -6 7 -8 -9 -10 11 -12 13 -14 -15 -16 17 -18 19 -20 -21 -22 23 -24 -25

#include<cstdio>

bool prim[2000001];
int n;

int main() {
  FILE *fin, *fout;
  fin = fopen("ciur.in", "r");
  fout = fopen("ciur.out", "w");
  fscanf(fin, "%d", &n);

  // 0 si 1 nu sunt prime
  prim[0] = prim[1] = false;
  for (int i = 2; i <= n; ++i) {
    // toate numerele de la 2 la n o sa le consider prime
    prim[i] = true;
  }

  for (int i = 2; i <= n; ++i) {
    // parcurg toate numerele
    if (prim[i] == true) {
      // daca numarul i este prim
      for (int j = 2 * i; j <= n; j = j + i) {
        // parcurg toti multiplii lui i si ii marchez ca fiind neprimi
        prim[j] = false;
      }
    }
  }

  int num = 0;
  for (int i = 2; i <= n; ++i) {
    if (prim[i] == true) {
      num++;
    }
  }

  fprintf(fout, "%d", num);

  fclose(fin);
  fclose(fout);
}