Cod sursa(job #981083)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 6 august 2013 13:18:01
Problema Ciurul lui Eratosthenes Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.73 kb
#include <stdio.h>

#define MAXSIZE (2 << 18)
#define GET_INDEX(i) 		(primes[(i/8)] & (1 << (i%8)))
#define SET_INDEX_TRUE(i) 	(primes[(i/8)] = (primes[(i/8)] | (1 << (i%8))))
#define SET_INDEX_FALSE(i) 	(primes[(i/8)] = (primes[(i/8)] & ~(1 << (i%8)))) 

unsigned char primes[MAXSIZE];

int main()
{
	int N;
	int i, j;
	int prime_numbers = 0;

	freopen("ciur.in", "r", stdin);
	freopen("ciur.out", "w", stdout);

	scanf("%d", &N);
	SET_INDEX_TRUE(2);
	for (i = 3; i <= N; i += 2)
		SET_INDEX_TRUE(i);

	for (i = 3; i <= N; i += 2)
		if (GET_INDEX(i))
			for (j = 3 * i; j <= N; j += (2 * i))
				SET_INDEX_FALSE(j);

	++prime_numbers;
	for (i = 3; i <= N; i += 2) 
		if (GET_INDEX(i)) ++prime_numbers;
	
	printf("%d", prime_numbers);

	return 0;
}