Cod sursa(job #3294518)

Utilizator luiz_felipeLuiz Felipe luiz_felipe Data 25 aprilie 2025 02:29:54
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

inline void del(unsigned char lista[], int nr) {
    lista[nr >> 3] &= ~(1 << (nr & 7));
}

inline bool check(unsigned char lista[], int nr) {
    return lista[nr >> 3] & (1 << (nr & 7));
}

int count_primes(int n) {
    int count = 1, i, j;
    int dim = n / 16 + 1;
    unsigned char *lista = new unsigned char[dim];

    for (i = 0; i < dim; lista[i] = 0xFF, ++i);
    for (i = 1; ((i * i) << 1) + (i << 1) <= n; ++i) {
        if (check(lista, i)) {
            for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {
                del(lista, j);
            }
        }
    }

    for (i = 1; (i << 1) + 1 <= n; ++i) {
        if (check(lista, i)) {
            ++count;
        }
    }

    delete []lista;
    return count;
}

ifstream f("ciur.in");
ofstream g("ciur.out");

int main() {
    int n;
    f >> n;
    g << count_primes(n);
    f.close();
    g.close();
}