Cod sursa(job #778410)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 14 august 2012 17:30:04
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb

#include <cstdio>
#include <cmath>

unsigned int Eratosthenes (unsigned int n)
{
	++n;
	unsigned int prime_numbers(1), current_prime, multiple;
	bool *numbers(new bool [n]( )), *prime(numbers + 3);
	const bool *const END(numbers + n);
	while (prime < END)
	{
		if (!*prime)
		{
			++prime_numbers;
			for (current_prime = prime - numbers, multiple = current_prime * 3, current_prime <<= 1 ; multiple < n ; multiple += current_prime)
				numbers[multiple] = true;
		}
		prime += 2;
	}
	delete [ ] numbers;
	return prime_numbers;
}

int main (void)
{
	std::freopen("ciur.in","r",stdin);
	std::freopen("ciur.out","w",stdout);
	unsigned int n;
	std::scanf("%u",&n);
	std::printf("%hu\n",Eratosthenes(n));
	std::fclose(stdin);
	std::fclose(stdout);
	return 0;
}