Cod sursa(job #782695)

Utilizator noctavianNastasie Ion Octavian noctavian Data 29 august 2012 00:34:44
Problema Ciurul lui Eratosthenes Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.67 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int nr_prime(int n, unsigned char* cp) {
	double i, j, nr = 1;
	for(i = 1;i < n; i++) {
		if((*(cp  + ((long)i) / 8) & (1 << ((long)i) % 8))  == 0) {
			nr++;
			for(j = 2*(i*i + i); j < n; j+= 2*i+1)
				*(cp + ((long)j) / 8) |= (1 << ((long)j) % 8);
		}
	}
	return nr;
}

int main() {
	int n, nr, i;
	FILE* f;
	unsigned char* storage;

	f = fopen("ciur.in","rt");
	fscanf(f, "%i", &n);
	fclose(f);

	n = n / 2 + n % 2;
	storage = (unsigned char*)calloc(n / 8 + (n % 8 > 0),sizeof(unsigned char));
	
	nr = nr_prime(n, storage);
	
	f = fopen("ciur.out", "wt");
	fprintf(f, "%i", nr);
	fclose(f);
	free(storage);
	return 0;
}