1 // El algoritmo utilizado para verificar que un numero es primo 2 // es la Criba de Eratóstenes 3 // https://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes 4 5 #include <iostream> 6 #include <fstream> 7 #include <iomanip> 8 #include <vector> 9 #include <ctime> 10 11 #define OUTPUT_FILE_PATH "primos.txt" 12 const unsigned int MAXIMO = 100000000; 13 14 void vectorDiscardNonPrimes(std::vector<bool> &v) { 15 v[0] = v[1] = false; // 0 y 1 no son primos 16 for (size_t i = 2; i*i < MAXIMO; ++i) { 17 if(v[i]) { 18 for (size_t j = i; j <= (MAXIMO/i); ++j) { 19 v[i*j] = false; 20 } 21 } 22 } 23 } 24 25 void vectorPrintToOpenFile( 26 const std::vector<bool> v, 27 std::ofstream &outputFile, 28 unsigned int &primesWritten) { 29 30 primesWritten = 0; 31 for (size_t i = 2; i < v.size(); ++i) { 32 if(v[i]) { 33 outputFile << i << std::endl; 34 primesWritten++; 35 } 36 } 37 } 38 39 int main (void) { 40 unsigned int startTime, primesFound; 41 double totalTime; 42 std::ofstream outputFile; 43 std::vector<bool> numeros(MAXIMO, true); 44 std::string timeUnit; 45 46 startTime = clock(); 47 vectorDiscardNonPrimes(numeros); 48 49 outputFile.open(OUTPUT_FILE_PATH); 50 if (!outputFile.is_open()) { 51 std::cerr << "ERROR: No se pudo abrir `" OUTPUT_FILE_PATH "`\n"; 52 return -1; 53 } 54 55 vectorPrintToOpenFile(numeros, outputFile, primesFound); 56 outputFile.close(); 57 totalTime = (double(clock() - startTime)) / CLOCKS_PER_SEC; 58 59 std::cout.precision(2); 60 timeUnit.assign("segundos"); 61 if(totalTime < 1) { 62 totalTime *= 1000; 63 timeUnit.assign("ms"); 64 std::cout.precision(0); 65 } 66 67 std::cout << std::fixed 68 << "Se encontraron `" << primesFound 69 << "` números primos en `" 70 << totalTime << "` " << timeUnit << std::endl; 71 72 return 0; 73 }
