CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
tps/1/primos.cpp (1874B)
   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 }