Cod sursa(job #761925)

Utilizator ioana26Ioana Andronescu ioana26 Data 27 iunie 2012 20:59:27
Problema Ciurul lui Eratosthenes Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 0.94 kb
/*
Algoritmul de aflare a numerelor prime mai mici decat un numar dat folosind ciurul lui Eratostene.
*/

#include <stdio.h>

#define MAXNUM  2000000

int prim[MAXNUM / 2];

int ciur_eratostene (int numar) {
    int prime = 0;
    int i, j;
    
    for (i = 1; ((i * i) << 1) + (i << 1) <= numar; i++)
        prim[i] = 0;

    for (i = 1; ((i * i) << 1) + (i << 1) <= numar; i++) {
        if (!prim[i]) {
            prime++;
            j = ((i * i) + 1) + (i << 1);
            while ((j << 1) + 1 <= numar) {
                prim[j] = 1;
                j += (i << 1) + 1;
            }
        }
    }
    return prime;
}

int main () {
	int numar;

    FILE *f_in = fopen("ciur.in", "r");
    FILE *f_out = fopen("ciur.out", "w");

    fscanf(f_in, "%d", &numar);
    int prime = ciur_eratostene(numar);
    int i;
    for (i = 1; 2 * i + 1 <= numar; i++) 
        if (!prim[i])
            prime++;

    fprintf(f_out, "%d\n", prime);
    
    return 0;
}