Cod sursa(job #521541)

Utilizator invatacelTudorache Marius invatacel Data 12 ianuarie 2011 19:36:36
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.52 kb
#include <cstring>
#include <cstdio>

#define VALUE(i) (((v[i/32])>>(i%32))&1)

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

	scanf ("%d",&N);
	int rez = 1;
	int *v = new int[N/32+1];	
	memset(v,0,sizeof(int)*(N/32+1));
	bool stop = false;

	for (int i=3;i<=N;i+=2)
		if (!VALUE(i))
		{
			rez++;
			if (stop) continue;
			if (i*i > N) stop = true;

			for (int j=i*i;j<=N;j+=i<<1)
				v[j/32] |= 1<<(j%32);
		}
	delete v;

	printf ("%d\n",rez);
	return 0;
}