Cod sursa(job #1301717)

Utilizator alex_gabAlex Dragoi alex_gab Data 26 decembrie 2014 12:38:17
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 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];

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);

    int k;
    for (k = 2; k <= size; ++k) {
        bitSet[k] = TRUE;
    }

    int numberOfPrimes = 0;
    int i, j;
    for (i = 2; i <= size; i++) {
        if (bitSet[i]) {
            numberOfPrimes++;
            for (j = 2 * i; j <= size; j += i) {
                bitSet[j] = FALSE;
            }
        }
    }

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

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


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

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

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