Magari dopo con calma spiego meglio l'algoritmo che ho adottato.
Dal momento che mi rendo conto di aver scritto del codice forse un po' ostico per chi è ancora alle prime armi, cerco di abbozzare un minimo di spiegazione.
Per simulare le sequenze relative alle combinazioni con ripetizione ho implementato la funzione
combinazione_R_successiva(), la quale, partendo dalla sequenza attuale (contenuta nei primi
k elementi di
u), ritorna
true se è stato possibile aggiornare
u alla sequenza successiva oppure
false se la sequenza corrente è quella finale (costituita da tutti
9). Per chiarire meglio quello che intendo, riporto come esempio parte dell'elenco delle
220 combinazioni con ripetizione per
n=10 e
k=3:
Codice:
1: 0 0 0
2: 0 0 1
3: 0 0 2
4: 0 0 3
5: 0 0 4
6: 0 0 5
7: 0 0 6
8: 0 0 7
9: 0 0 8
10: 0 0 9
11: 0 1 1
12: 0 1 2
13: 0 1 3
14: 0 1 4
15: 0 1 5
16: 0 1 6
17: 0 1 7
18: 0 1 8
19: 0 1 9
20: 0 2 2
...
52: 0 7 9
53: 0 8 8
54: 0 8 9
55: 0 9 9
56: 1 1 1
57: 1 1 2
58: 1 1 3
59: 1 1 4
60: 1 1 5
61: 1 1 6
62: 1 1 7
63: 1 1 8
64: 1 1 9
65: 1 2 2
...
206: 6 7 8
207: 6 7 9
208: 6 8 8
209: 6 8 9
210: 6 9 9
211: 7 7 7
212: 7 7 8
213: 7 7 9
214: 7 8 8
215: 7 8 9
216: 7 9 9
217: 8 8 8
218: 8 8 9
219: 8 9 9
220: 9 9 9
L'array
v, che viene aggiornato ad ogni modifica di
k, contiene elementi il cui valore è uguale al corrispettivo indice elevato al numero
k di cifre considerate.
Presa una generica sequenza contenuta in
u, diventa quindi immediato calcolare la somma ad essa relativa. Per esempio considerando la sequenza
(1 3 5), la somma può essere calcolata semplicemente come
sum=v[1]+v[3]+v[5]=153
essendo
v[1]=1^3
v[3]=3^3
v[5]=5^3
A questo punto non resta che verificare se
sum=153 è un numero di Armstrong o meno, e per farlo è sufficiente verificare due semplici condizioni:
1) l'intero
sum deve avere un numero di cifre uguale al valore corrente di
k (pari a
3 nell'esempio considerato). Ciò può essere fatto semplicemente ricorrendo a
v[10] mediante la condizione
v[10]/10<=sum<v[10] (che nel caso specifico, essendo
v[10]=10^3=1000, si traduce in
100<=153<1000);
2) le
k cifre che costituiscono
sum devono essere le stesse (anche se in ordine sparso) che costituiscono la sequenza in
u. Ciò nel codice lo faccio appoggiandomi ad un array
w che funge da una sorta di tabella hash.
@BAT &
@DispatchCode
grazie davvero per le belle parole!
Una curiosità, fai il programmatore per lavoro o è solo una passione e ti occupi di altro (o magari studi ancora)?
Diciamo che più o meno studio ancora, in ogni caso non sono un programmatore né studio informatica, mi sono avvicinato alla programmazione grazie ad un esame a scelta di fondamenti da 6 crediti durante la triennale; da lì mi sono appassionato alla materia e ho approfondito un po' di C e C++ da autodidatta.
Alla fine si tratta di un hobby ed utilizzo la programmazione fondamentalmente come esercizio di logica... mi diverto a risolvere problemi e ad inventare algoritmi partendo da zero!
