vuoi
o PayPal
tutte le volte che vuoi
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.
}
}
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;