Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- NUMEROS PERFEITOS:
- Todo o número natural que for igual à soma de todos os seus divisores, excluíndo-se o próprio número.
- {6, 28, 496, 8128, 33550336, 8589869056, …}
- Programa testado no linux
- */
- #include<iostream>
- #include <fstream>
- #include<sstream>
- #include <stdlib.h>
- using namespace std;
- const string pathFile = "num_perf_cache.log";
- //Prototipos
- void get_perfeitos(unsigned long int ini, unsigned long int fim, stringstream &ss);
- void ReadLastNumberinFile(unsigned long int &limitTest, stringstream &strNumbers);
- void SaveFile(string fillLog);
- void print_cache(unsigned long int n, string s);
- int main() {
- setlocale(LC_ALL,"Portuguese");
- unsigned long int n, limitTest=2;
- stringstream ss, ssPerf; //Armazena os numeros perfeitos como string, separado por ";"
- cout<<"NUMEROS PERFEITOS:\n Insira o valor limite: ";
- cin>>n;
- ReadLastNumberinFile(limitTest, ssPerf);
- //cout << "\nlimitTest:" << limitTest << "\nstrNumbers:" << ssPerf.str() << endl << endl;
- cout<<"\nOs valores perfeitos são:"<<endl;
- if(limitTest > 2 and ssPerf.str() != "") {
- print_cache(n, ssPerf.str());
- ss << ssPerf.str();
- }
- //@TODO: Deveria imprimir os números do cache (função print_cache) antes de iniciar a busca de novos (get_perfeitos)
- //Mas quando existe um range grande para buscar, acima do último já gravado no arquivo (pathFile) a impressão so ocorre
- //depois que finaliza a função de busca (get_perfeitos)
- if(n > limitTest) {
- //Verifica os numeros perfeitos
- get_perfeitos(limitTest+1, n, ss);
- //Grava a quebra de linha e o numero limite na ultima linha
- ss << '\n' << n;
- //Salva o arquivo
- SaveFile(ss.str());
- }
- cout << endl << endl;
- return 0;
- }
- //Busca novos números perfeitos
- void get_perfeitos(unsigned long int ini, unsigned long int fim, stringstream &ss) {
- unsigned long int i, j, aux=0;
- for(i=ini; i<=fim; i++) {
- //cout << "i: " << i << endl;
- for(j=2; j<=(i/2); j++) {
- if(i%j==0)
- aux+=j;
- }
- if(aux+1 == i){
- cout<<i<<";";
- ss << i << ';';
- }
- aux=0;
- }
- }
- //Lê o arquivo de cache para pegar os números perfeitos já salvos
- void ReadLastNumberinFile(unsigned long int &limitTest, stringstream &strNumbers) {
- ifstream file(pathFile.c_str());
- string str;
- int i = 0;
- while (std::getline(file, str)) {
- if(i==0) {
- strNumbers << str;
- i++;
- }
- else
- limitTest = strtoul(str.c_str(), NULL, 0);
- }
- }
- //Salva o arquivo de cache para armazenar os números perfeitos
- void SaveFile(string fillLog) {
- ofstream myfile;
- myfile.open (pathFile.c_str());
- myfile << fillLog;
- myfile.close();
- }
- //Imprime os números perfeitos salvos no cache até o limite solicitado pelo usuário
- void print_cache(unsigned long int n, string s) {
- string token, delimiter = ";";
- unsigned long int aux;
- size_t pos = 0;
- while ((pos = s.find(delimiter)) != string::npos) {
- token = s.substr(0, pos);
- aux = strtoul(token.c_str(), NULL, 0);
- if(aux <= n) {
- cout << token << ";";
- s.erase(0, pos + delimiter.length());
- } else
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement