Cod sursa(job #144687)

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

int n, i, j, p[Nmax], N=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", N);
	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) )
		{
			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);

		}
}