Cod sursa(job #981114)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 6 august 2013 14:09:27
Problema Ciurul lui Eratosthenes Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 0.72 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, sqrtn;
	register int i, j, step;
	register int prime_numbers = 0;

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

	scanf("%d", &N);
	sqrtn = (int) sqrt((double)N);

	// 2 is a prime number
	++prime_numbers;
	for (i = 3; i <= N; i += 2) 
		if (!GET_INDEX(i)) {
			++prime_numbers;

			step = i << 1;
			for (j = i + step; j <= sqrtn; j += step)
				SET_INDEX_TRUE(j);
		}
	
	printf("%d", prime_numbers);

	return 0;
}