Cod sursa(job #144708)

Utilizator coderninuHasna Robert coderninu Data 27 februarie 2008 21:23:08
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <stdio.h>
#define Nmax 200001
#define bit 25

int n, i, j, p[Nmax], N=1, rez=1;

struct nod { int nr; nod * urm; } * que, *last;

void ciur(int);

int main()
{
	fscanf(fopen("ciur.in", "r"), "%d", &n);
	ciur(n);
	freopen("ciur.out", "w", stdout);
	printf("%d\n", rez);
	for (; que; que=que->urm)
		printf("%d ", que->nr);
	fclose(stdout);
	return 0;
}

void ciur(int n)
{
	que=new nod;
	que->nr=2;
	que->urm=NULL;
	last=que;
	for (i=3; i<=n; i+=2)
		if (!(p[ ((i-1)>>1) / bit ] & (1<< (((i-1)>>1)%bit))))
		{
			rez++;
			if (N<1000)
			{
				N++;
				nod * q= new nod;
				q->nr=i;
				q->urm=NULL;
				last->urm=q;
				last=q;
			}
			else
			{
				nod * q=que;
				que=que->urm;
				delete q;
				q=new nod;
				q->nr=i;
				q->urm=NULL;
				last->urm=q;
				last=q;
			}

			for (j=3*i; j<=n; j+= i<<1 )
				p[ ((j-1)>>1) / bit ] |= 1 << (((j-1)>>1)%bit);

		}
}