Cod sursa(job #188363)

Utilizator scvrentScvrent Alexdrei scvrent Data 8 mai 2008 07:02:48
Problema Ciurul lui Eratosthenes Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#define pune(x) nrp[contor_numere_prime++]=x
using namespace std;

#define N 10000

int nrp[N], contor_numere_prime = 3, candidat = 6, n;

inline int prim(int x)
{
	for(int i=0;i<contor_numere_prime;++i) if(x%nrp[i]==0) return 0;
	//toate numerele prime pe care le am in vector...
	
	return 1; //daca nu am gasit nici unul care sa il divida pe x, e prim.
}

int main()
{
	/*

	doresc sa gasesc numerele prime pana la n

	voi verifica toate numerele de forma 6k+1 si 6k+5 (deoarece restul sigur nu sunt prime)

	verificarea o voi face pe baza numerelor prime deja existente in vector.

	*/
	
	ifstream fi("ciur.in");
	fi>>n;
	fi.close();
	nrp[0] = 2;
	nrp[1] = 3; 
	nrp[2] = 5;
	while(1)
	{
		if(candidat>n) break;
		if(prim(candidat+1)) pune(candidat+1);
		if(prim(candidat+5)) pune(candidat+5);
		candidat += 6;
	}
	while(nrp[contor_numere_prime - 1] > n) contor_numere_prime--;
	ofstream fo("ciur.out");
	fo<<contor_numere_prime<<"\n";
	fo.close();
	return 0;
}