Advertisement
wagner-cipriano

Números perfeitos com cache em arquivo

May 12th, 2020
1,508
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. /*
  2.  NUMEROS PERFEITOS:
  3.  Todo o número natural que for igual à soma de todos os seus divisores, excluíndo-se o próprio número.
  4.  {6, 28, 496, 8128, 33550336, 8589869056, …}
  5.  Programa testado no linux
  6. */
  7. #include<iostream>
  8. #include <fstream>
  9. #include<sstream>
  10. #include <stdlib.h>
  11. using namespace std;
  12. const string pathFile = "num_perf_cache.log";
  13.  
  14. //Prototipos
  15. void get_perfeitos(unsigned long int ini, unsigned long int fim, stringstream &ss);
  16. void ReadLastNumberinFile(unsigned long int &limitTest, stringstream &strNumbers);
  17. void SaveFile(string fillLog);
  18. void print_cache(unsigned long int n, string s);
  19.  
  20. int main() {
  21.     setlocale(LC_ALL,"Portuguese");
  22.     unsigned long int n, limitTest=2;
  23.     stringstream ss, ssPerf; //Armazena os numeros perfeitos como string, separado por ";"
  24.  
  25.     cout<<"NUMEROS PERFEITOS:\n  Insira o valor limite: ";
  26.     cin>>n;
  27.  
  28.     ReadLastNumberinFile(limitTest, ssPerf);
  29.     //cout << "\nlimitTest:" << limitTest << "\nstrNumbers:" << ssPerf.str() << endl << endl;
  30.  
  31.     cout<<"\nOs valores perfeitos são:"<<endl;
  32.     if(limitTest > 2 and ssPerf.str() != "") {
  33.       print_cache(n, ssPerf.str());
  34.       ss << ssPerf.str();
  35.     }
  36.     //@TODO: Deveria imprimir os números do cache (função print_cache) antes de iniciar a busca de novos (get_perfeitos)
  37.     //Mas quando existe um range grande para buscar, acima do último já gravado no arquivo (pathFile) a impressão so ocorre
  38.     //depois que finaliza a função de busca (get_perfeitos)
  39.  
  40.     if(n > limitTest) {
  41.         //Verifica os numeros perfeitos
  42.         get_perfeitos(limitTest+1, n, ss);
  43.         //Grava a quebra de linha e o numero limite na ultima linha
  44.         ss << '\n' << n;
  45.         //Salva o arquivo
  46.         SaveFile(ss.str());
  47.     }
  48.     cout << endl << endl;
  49.     return 0;
  50. }
  51.  
  52. //Busca novos números perfeitos
  53. void get_perfeitos(unsigned long int ini, unsigned long int fim, stringstream &ss) {
  54.     unsigned long int i, j, aux=0;
  55.     for(i=ini; i<=fim; i++) {
  56.         //cout << "i: " << i << endl;
  57.         for(j=2; j<=(i/2); j++) {
  58.             if(i%j==0)
  59.                 aux+=j;
  60.         }
  61.         if(aux+1 == i){
  62.             cout<<i<<";";
  63.             ss << i << ';';
  64.         }
  65.         aux=0;
  66.     }
  67. }
  68.  
  69. //Lê o arquivo de cache para pegar os números perfeitos já salvos
  70. void ReadLastNumberinFile(unsigned long int &limitTest, stringstream &strNumbers) {
  71.     ifstream file(pathFile.c_str());
  72.     string str;
  73.     int i = 0;
  74.     while (std::getline(file, str)) {
  75.       if(i==0) {
  76.         strNumbers << str;
  77.         i++;
  78.       }
  79.       else
  80.         limitTest = strtoul(str.c_str(), NULL, 0);
  81.     }
  82. }
  83.  
  84. //Salva o arquivo de cache para armazenar os números perfeitos
  85. void SaveFile(string fillLog) {
  86.     ofstream myfile;
  87.     myfile.open (pathFile.c_str());
  88.     myfile << fillLog;
  89.     myfile.close();
  90. }
  91.  
  92. //Imprime os números perfeitos salvos no cache até o limite solicitado pelo usuário
  93. void print_cache(unsigned long int n, string s) {
  94.     string token, delimiter = ";";
  95.     unsigned long int aux;
  96.     size_t pos = 0;
  97.     while ((pos = s.find(delimiter)) != string::npos) {
  98.         token = s.substr(0, pos);
  99.         aux = strtoul(token.c_str(), NULL, 0);
  100.         if(aux <= n) {
  101.           cout << token << ";";
  102.           s.erase(0, pos + delimiter.length());
  103.         } else
  104.           break;
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement