Cod sursa(job #981028)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 6 august 2013 11:27:27
Problema Ciurul lui Eratosthenes Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <math.h>

#define MAXSIZE 2000001

char primes[MAXSIZE];


int is_prime(int a)
{
	int i;
	int sqr;
	
	if (a < 2) 		return 0;
	if (a == 2) 	return 1;
	// besides 2, even numbers can not be prime
	if (a % 2 == 0) return 0;

	sqr = (int)	sqrt((double)a);
	for (i = 3; i <= sqr; i += 2)
		if (a % i == 0) return 0;

	return 1;
}

int ciur_1(int n)
{
	int i;
	int nprimes = 0;

	for (i = 2; i <= n; ++i)
		if (is_prime(i)) ++nprimes;

	return nprimes;
}


void init_primes(int n)
{
	primes[2] = 1;

	int i;
	for (i = 3; i <= n; i += 2)
		primes[i] = 1;
}

int get_number_of_prime_numbers(int n)
{
	int i;
	int nr = 0;
	for (i = 2; i <= n; ++i)
		if (primes[i]) ++nr;	

	return nr;
}

int ciur_2(int n)
{	
	int i, j;
	init_primes(n);

	for (i = 2; i <= n; ++i)
		if (primes[i]) 
			for (j = 2 * i; j <= n; j += i)
				primes[j] = 0;

	return get_number_of_prime_numbers(n);
}

int ciur_3(int n)
{	
	int i, j;
	init_primes(n);

	for (i = 2; i <= n; ++i)
		if (primes[i]) 
			for (j = 2 * i; j <= n; j += (2 * i))
				primes[j] = 0;

	return get_number_of_prime_numbers(n);
}


int main()
{
	int N;
	freopen("ciur.in", "r", stdin);
	freopen("ciur.out", "w", stdout);

	scanf("%d", &N);
	printf("%d\n", ciur_3(N));

	return 0;
}