Cod sursa(job #2263991)

Utilizator preda.andreiPreda Andrei preda.andrei Data 19 octombrie 2018 18:05:40
Problema Ciurul lui Eratosthenes Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>

int Get(char vec[], int pos)
{
    int block = pos / 8;
    int offset = pos % 8;

    if (vec[block] & (1 << offset)) {
        return 1;
    }
    return 0;
}

void Set(char vec[], int pos, int val)
{
    int block = pos / 8;
    int offset = pos % 8;

    if (val == 0) {
        vec[block] &= (~(1 << offset));
    } else {
        vec[block] |= (1 << offset);
    }
}

#define NMAX 2000000
char is_not_prime[NMAX / 8 + 5];

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

    int n;
    fscanf(fin, "%d", &n);

    int prime_count = 0;
    for (int i = 2; i <= n; i += 1) {
        if (Get(is_not_prime, i)) {
            continue;
        }

        prime_count += 1;
        for (long long int j = 1LL * i * i; j <= n; j += i) {
            Set(is_not_prime, j, 1);
        }
    }

    fprintf(fout, "%d\n", prime_count);
    return 0;
}