Skip to content

Instantly share code, notes, and snippets.

@pedrxd
Last active January 1, 2020 12:26
Show Gist options
  • Save pedrxd/54ab0e5a6e85fa366ca017faa9d19d66 to your computer and use it in GitHub Desktop.
Save pedrxd/54ab0e5a6e85fa366ca017faa9d19d66 to your computer and use it in GitHub Desktop.
Generador de numeros primos simple e intuitivo
/*
Calculadora de primos usando la criba de Erastóstenes
Pedro Ruiz 2018
*/
//Muestra los calculos uno a uno
#define HUMANCALCULATION 0
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#if HUMANCALCULATION
#include <chrono>
#include <thread>
#endif
using namespace std;
int main(int args, char *argv[])
{
vector<int> primos;
int N;
//Indicamos el primer numero primo que conocemos y comenzamos a partir de este
primos.push_back(2);
//sizeP == primos.size() || Para un acceso mas rapido
int sizeP = 1;
if(args == 1)
{
cout << "¿Cuantos numeros primeros quieres comprobar? ";
cin >> N;
if(N < 2)
return -1;
}else
{
N = atoi(argv[1]);
}
//Loop que pasara por todos los numeros del 3 hasta el N-1
for(int i = 3; i < N; i++)
{
//Damos por supuesto que todos los numeros pueden ser primos
bool isPrime = true;
int sqi = sqrt(i);
#if HUMANCALCULATION
cout << "Checking " << i << endl;
#endif
//Buscamos un resto cero haciendo la division de i entre todos los numeros
//primos conocidos hasta el momento
for(int a = 0; a < sizeP && primos[a] <= sqi; a++)
{
#if HUMANCALCULATION
cout << "\t" << i << "%" << primos[a] << "=" << i%(primos[a]) << endl;
this_thread::sleep_for(std::chrono::milliseconds(500));
#endif
//Al ser el resto 0 podemos asegurar que no es primo
if(!(i%(primos[a])))
{
isPrime = false;
break;
}
}
//Guardamos en la lista
if (isPrime)
{
primos.push_back(i);
sizeP++;
}
}
cout << "Se encontraron [" << sizeP << "] números primos.\n" << endl;
//Solo preguntar para guardar si hay interaccion humana
#if HUMANCALCULATION
char saveit;
cout << "¿Quieres guardarlos en una lista? [S/n] ";
cin >> saveit;
if(saveit == 'n')
{
cout << "No ha sido guardada" << endl;
return 0;
}
#endif
ofstream primefile;
primefile.open("primes.txt");
if(primefile.is_open())
{
for(int i = 0; i < sizeP; i++)
{
primefile << primos[i] << endl;
}
}else
{
cout << "No he podido crear el archivo, ¿tengo permisos?" <<endl;
}
primos.clear();
primefile.close();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment