Cod sursa(job #641206)

Utilizator alexandrapAlexandra Podiuc alexandrap Data 27 noiembrie 2011 15:38:35
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#include<unistd.h>
#include<math.h>
#include<string.h>

char vect[2000001];

int is_prime(int n){
	long i;
	int c = 0;
	
	if (n == 1 || n == 4 || n == 6)
		return 0;
	
	if (n == 2 || n == 3 || n == 5)
		return 1;
	
	if (n%2 == 0)
		return 0;
	
	long q=sqrt((long ) n);
	for(i = 3; i <= q; i+=2){
		if(n%i == 0)
			return 0;
	}
	return 1;
}

int easy_sol(int N){
	int i, c = 0;
	for (i = 2; i < N ; i++){
		if (is_prime(i))
			c++;
	}
	return c;
}


int eratostene(int N) {
	int cur_pos = 2, count = 0;
	int i;
	while(cur_pos <= N) {
		count++;
		for ( i = cur_pos*2; i <= N; i+=cur_pos){
			vect[i] = 0;
		}
		cur_pos++;
		while( vect[cur_pos] == 0 && cur_pos <=N){
			cur_pos++;
		}
	}
	return count;
}	


int main(){
	int N, M;
	FILE* fin = fopen("ciur.in","r");
	FILE* fout = fopen("ciur.out", "w");
    fscanf(fin, "%d", &N);
	//printf("N = %d\n ", N);
	//M = easy_sol(N);
	memset(vect, 1, (N+1)*sizeof(char ));
	M = eratostene(N);
	//printf("M = %d\n", M);
	fprintf(fout,"%d", M);
	fclose(fin);
	fclose(fout);
	
	
	return 0;
}