Anteprima
Vedrai una selezione di 1 pagina su 3
Programma C++ - Numeri perfetti Pag. 1
1 su 3
Disdici quando vuoi 162x117
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Sintesi
Numeri perfetti C++


Il programma considera un numero intero (es.: 24) si puo' trovare l'elenco di tutti i suoi divisori (es.: 1,2,3,4,6,8,12). La loro somma e' (qui) 36, che e' diverso da 24.Se invece tale somma e' uguale al numero stesso, il numero si dice perfetto.
Estratto del documento

}

}

if (cur_fattore!=1){

if (preced_fattore==cur_fattore){

// basta aumentare l'esponente dell'ultimo

// elemento... quello corrente.

fattori[fattori.size()-1][1]++;

}

else {

// in questo caso invece bisogna aggiungere

// un elemento a fattori e impostarne entrambi

// i valori.

vector <unsigned long int> temp_coppia;

temp_coppia.push_back(cur_fattore);

temp_coppia.push_back(1);

fattori.push_back(temp_coppia);

preced_fattore = cur_fattore; // per il prossimo giro

}

scomposizione+=((first?"":" * ")+int_to_ascii(cur_fattore));

first = false;

}

} while (temp_n>1);

// ora fattori[] contiene tutti e soli i fattori primi con il

// loro esponente... si passa alla verifica che sia perfetto.

// Per prima cosa occorre (ahi ahi ahi!) costruire un elenco

// di tutti i divisori (anche nonprimi!)...

// tutti e soli i divisori si troveranno facendo variare

// secondo un "for generalizzato" (cfr. determinante nell'esercizio

// delle matrici NxM) un set di rotelle : l'i-esima rotella varia da

// 0 a fattori[i][1]-1. Se si escludono le configurazioni "tutti zeri"

// (divisore=1) e "tutti uguali a fattori[][1]-1" (divisore=num)

// allora ad ogni ciclo di questo "for" si puo' costruire il divisore

// corrente:

vector <unsigned long int> indici; //parallela a fattori[i][0]!

for (i=0; i<fattori.size(); i++){

indici.push_back(0);

}

indici[0]=1; // prima configurazione valida (000...001)

bool uscire = false;

bool esaurito_update;

unsigned int cur_ind;

unsigned long int somma = 0;

unsigned long int contributo;

for (;;) {

// si e' almeno alla prima configurazione valida,

// ma verra' anche contato num, come ultima

// configurazione: lo si togliera' alla fine!

contributo = 1;

for (i=0; i<indici.size(); i++) {

contributo*=(unsigned long int)(pow(fattori[i][0],indici[i]));

}

somma+=contributo;

esaurito_update = false;

cur_ind = 0;

do { indici[cur_ind++]++;

if (indici[cur_ind-1] <= fattori[cur_ind-1][1]) {

esaurito_update=true;

}

else {

indici[cur_ind-1] = 0;

if (cur_ind==indici.size()) {

uscire = true;

Dettagli
Publisher
3 pagine
325 download