Cod sursa(job #2660109)

Utilizator catalin69420Gogu Popescu catalin69420 Data 18 octombrie 2020 11:32:16
Problema Ciurul lui Eratosthenes Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef unsigned long ulong;

ulong sieve(ulong n) {
    char* prime = malloc((n + 1) * sizeof(char));
    if (!prime) {
        fprintf(stderr, "Error, failed to allocate memory\n");
        exit(EXIT_FAILURE);
    }
    memset(prime, 1, sizeof(prime));

    for (ulong i = 2; i * i <= n; i++)
        if (prime[i] == 1)
            // Update all multiples of p greater than or
            // equal to the square of it
            // numbers which are multiple of p and are
            // less than p^2 are already been marked.
            for (ulong j = i * i; j <= n; j += i)
                prime[i] = 0;

    ulong count = 0;
    for (ulong i = 2; i <= n; i++)
        if (prime[i])
            count++;

    return count;
}

int main() {
    FILE* in = fopen("ciur.in", "r");
    if (!in) {
        return 0;
    }

    FILE* out = fopen("ciur.out", "w");
    if (!out) {
        fclose(in);
        return 0;
    }

    ulong n;
    int r = fscanf(in, "%lu", &n);
    if (r != 1) {
        fclose(in);
        fclose(out);
        return 0;
    }

    fprintf(out, "%lu", sieve(n));

    fclose(in);
    fclose(out);

    return 0;
}