Codice C++
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
vector <int> primi;
string scomposizione;
bool is_perfect(unsigned long int);
string int_to_ascii(unsigned long int);
int main(){
//carica dell'elenco di numeri primi
unsigned int maxprimo;
ifstream inp_file("n_primi.txt", ios::out);
int temp;
for(;;){
inp_file >> temp;
if (inp_file.eof()) break;
primi.push_back(temp);
maxprimo = temp;
}
unsigned int i;
//controllo per n da 2 a maxprimo+1 se e' un numero perfetto...
unsigned long int n;
cout << "==> Numeri perfetti (fino a " << maxprimo+1 << "):\n";
for (n=2; n<=maxprimo+1; n++){
if (is_perfect(n)) cout << "--> " << n << " = " << scomposizione <<
endl; }
cout << "==> Ricerca terminata.\n==> Grazie per avere fatto uso "
<< "di questo programma\n";
return 0;
}
bool is_perfect(unsigned long int num){
scomposizione = "";
vector <vector <unsigned long int> > fattori;
// si decide che sara' di dimensioni Nx2, con:
// fattori[i][0] = fattore primo i-esimo
// fattori[i][1] = potenza con cui compare (1,2,...)
unsigned long int temp_n = num;
unsigned int i, j;
unsigned long int cur_fattore;
// scomposizione in fattori primi
unsigned long int preced_fattore;
scomposizione = "";
bool first = true; // flag per evitare un " * " prima del primo...
preced_fattore = 1;
do { cur_fattore = 1; // per rilevare la fine dell'operazione
// dopo il seguente for
for (i=0; i<primi.size(); i++){
cur_fattore = primi[i];
if ((temp_n/(cur_fattore*1.0))==(int)(temp_n/cur_fattore)) {
temp_n = temp_n/cur_fattore;
break;
Numeri perfetti C++
Il programma considera un numero intero (es.: 24) si può trovare l'elenco di tutti i suoi divisori (es.: 1, 2, 3, 4, 6, 8, 12). La loro somma è (qui) 36, che è diverso da 24. Se invece tale somma è uguale al numero stesso, il numero si dice perfetto.