Cod sursa(job #251758)

Utilizator willliIonel Bratianu willli Data 3 februarie 2009 12:26:31
Problema Ciurul lui Eratosthenes Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 0.78 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define in "ciur.in"
#define out "ciur.out"
#define MAX 2000000

unsigned long sieve(unsigned long n)
{
	unsigned long nr, i, j, l;
	unsigned char s[MAX/2+1];
	
	if (n == 2)
	{
		return 1;
	} 
	nr = 1;
	
	for (i = 3; i <= n; i+=2 )
	{
		if ((s[i/2/8] & (1<<i/2%8))== 0)
		{			
			nr++;
			j = i * i;
			l = 2 * i;
			while (j <= n)
			{
				//printf("i %ld j %ld j/2 %ld\n",i, j, j/2);
				s[j / 2 / 8] |= 1<<(j/2%8);
				j += l;
			}		
		}	
	}

	return nr;	
}

int main()
{
	unsigned long n;
	FILE *fin, *fout;
	
	if ((fin = fopen(in, "r")) == NULL)
	{
		printf("Eroare \n");
		exit(-1);
	}
	fscanf(fin, "%ld", &n);
	fclose(fin);
	fout = fopen(out, "w");
	n = sieve(n);
	printf("%ld\n", n);
	fprintf(fout,"%ld", n);
	fclose(fout);
	return 0;
}