Cod sursa(job #1301660)

Utilizator alex_gabAlex Dragoi alex_gab Data 26 decembrie 2014 12:04:49
Problema Ciurul lui Eratosthenes Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <string.h>
#include <errno.h>

static const int TRUE = 1;
static const int FALSE = 0;
const char *IN_FILE_NAME = "ciur.in";
const char *OUT_FILE_NAME = "ciur.out";

FILE *inputFile, *outputFile;
int bitSet[2000001];

void markBitSet(int dimension);

void clearCompositeIndexes(int dimension);

int getNumberOfPrimes(int size);

int main(int argc, char *argv[]) {
    inputFile = fopen(IN_FILE_NAME, "r");
    if (inputFile == NULL) {
        printf("Could not open file for read: %s", strerror(errno));
        return 1;
    }

    int size;
    fscanf(inputFile, "%d", &size);

    markBitSet(size);

    clearCompositeIndexes(size);

    outputFile = fopen(OUT_FILE_NAME, "w");
    if (outputFile == NULL) {
        printf("Could not open file for write: %s", strerror(errno));
        return 1;
    }
    int numberOfPrimes = getNumberOfPrimes(size);
    fprintf(outputFile, "%d", numberOfPrimes);

    fclose(inputFile);
    fclose(outputFile);
    return 0;
}


void markBitSet(int dimension) {
    int i;
    for (i = 0; i <= dimension; ++i) {
        bitSet[i] = TRUE;
    }
}

void clearCompositeIndexes(int dimension) {
    bitSet[0] = FALSE;
    bitSet[1] = FALSE;
    int i, j;
    for (i = 2; i * i <= dimension; i++) {
        if (bitSet[i]) {
            for (j = i * i; j <= dimension; j += i) {
                bitSet[j] = FALSE;
            }
        }
    }
}

int getNumberOfPrimes(int size) {
    int numberOfPrimes = 0;
    int i;
    for (i = 0; i <= size; i++) {
        if (bitSet[i]) {
            numberOfPrimes++;
        }
    }
    return numberOfPrimes;
}