Vedo che molte persone hanno risposto alla domanda sull'overflow, ma volevo affrontare il suo problema originale. Ha detto che il problema era trovare una b = c in modo tale che tutte le cifre vengano utilizzate senza ripetere. Ok, non è quello che ha chiesto in questo post, ma penso ancora che fosse necessario studiare il limite superiore del problema e concludere che non avrebbe mai bisogno di calcolare o rilevare un overflow (nota: non sono competente in matematica quindi ho fatto questo passo per passo, ma il risultato finale è stato così semplice che questo potrebbe avere una formula semplice).
Il punto principale è che il limite superiore richiesto dal problema per a, b o c è 98.765.432. Ad ogni modo, iniziando dividendo il problema nelle parti banali e non banali:
- x 0 == 1 (tutte le permutazioni di 9, 8, 7, 6, 5, 4, 3, 2 sono soluzioni)
- x 1 == x (nessuna soluzione possibile)
- 0 b == 0 (nessuna soluzione possibile)
- 1 b == 1 (nessuna soluzione possibile)
- a b , a> 1, b> 1 (non banale)
Ora non ci resta che dimostrare che non sono possibili altre soluzioni e che solo le permutazioni sono valide (e quindi il codice per stamparle è banale). Torniamo al limite superiore. In realtà il limite superiore è c ≤ 98.765.432. È il limite superiore perché è il numero più grande con 8 cifre (10 cifre in totale meno 1 per ciascuna aeb). Questo limite superiore è solo per c perché i limiti di aeb devono essere molto più bassi a causa della crescita esponenziale, come possiamo calcolare, variando b da 2 al limite superiore:
9938.08^2 == 98765432
462.241^3 == 98765432
99.6899^4 == 98765432
39.7119^5 == 98765432
21.4998^6 == 98765432
13.8703^7 == 98765432
9.98448^8 == 98765432
7.73196^9 == 98765432
6.30174^10 == 98765432
5.33068^11 == 98765432
4.63679^12 == 98765432
4.12069^13 == 98765432
3.72429^14 == 98765432
3.41172^15 == 98765432
3.15982^16 == 98765432
2.95305^17 == 98765432
2.78064^18 == 98765432
2.63493^19 == 98765432
2.51033^20 == 98765432
2.40268^21 == 98765432
2.30883^22 == 98765432
2.22634^23 == 98765432
2.15332^24 == 98765432
2.08826^25 == 98765432
2.02995^26 == 98765432
1.97741^27 == 98765432
Si noti, ad esempio, l'ultima riga: si dice che 1.97 ^ 27 ~ 98M. Quindi, ad esempio, 1 ^ 27 == 1 e 2 ^ 27 == 134.217.728 e questa non è una soluzione perché ha 9 cifre (2> 1.97, quindi in realtà è più grande di ciò che dovrebbe essere testato). Come si può vedere, le combinazioni disponibili per il test aeb sono davvero piccole. Per b == 14, dobbiamo provare 2 e 3. Per b == 3, iniziamo da 2 e ci fermiamo a 462. Tutti i risultati sono garantiti per essere inferiori a ~ 98M.
Ora prova tutte le combinazioni sopra e cerca quelle che non ripetono alcuna cifra:
['0', '2', '4', '5', '6', '7', '8'] 84^2 = 7056
['1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481
['0', '1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481 (+leading zero)
['1', '2', '3', '5', '8'] 8^3 = 512
['0', '1', '2', '3', '5', '8'] 8^3 = 512 (+leading zero)
['1', '2', '4', '6'] 4^2 = 16
['0', '1', '2', '4', '6'] 4^2 = 16 (+leading zero)
['1', '2', '4', '6'] 2^4 = 16
['0', '1', '2', '4', '6'] 2^4 = 16 (+leading zero)
['1', '2', '8', '9'] 9^2 = 81
['0', '1', '2', '8', '9'] 9^2 = 81 (+leading zero)
['1', '3', '4', '8'] 3^4 = 81
['0', '1', '3', '4', '8'] 3^4 = 81 (+leading zero)
['2', '3', '6', '7', '9'] 3^6 = 729
['0', '2', '3', '6', '7', '9'] 3^6 = 729 (+leading zero)
['2', '3', '8'] 2^3 = 8
['0', '2', '3', '8'] 2^3 = 8 (+leading zero)
['2', '3', '9'] 3^2 = 9
['0', '2', '3', '9'] 3^2 = 9 (+leading zero)
['2', '4', '6', '8'] 8^2 = 64
['0', '2', '4', '6', '8'] 8^2 = 64 (+leading zero)
['2', '4', '7', '9'] 7^2 = 49
['0', '2', '4', '7', '9'] 7^2 = 49 (+leading zero)
Nessuno di questi corrisponde al problema (che può essere visto anche dall'assenza di '0', '1', ..., '9').
Il codice di esempio che lo risolve segue. Nota anche che è scritto in Python, non perché necessita di interi di precisione arbitrari (il codice non calcola nulla di più grande di 98 milioni), ma perché abbiamo scoperto che la quantità di test è così piccola che dovremmo usare un linguaggio di alto livello per fare uso dei suoi contenitori e librerie integrati (nota anche: il codice ha 28 righe).
import math
m = 98765432
l = []
for i in xrange(2, 98765432):
inv = 1.0/i
r = m**inv
if (r < 2.0): break
top = int(math.floor(r))
assert(top <= m)
for j in xrange(2, top+1):
s = str(i) + str(j) + str(j**i)
l.append((sorted(s), i, j, j**i))
assert(j**i <= m)
l.sort()
for s, i, j, ji in l:
assert(ji <= m)
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d' % (s, i, j, ji)
# Try with non significant zero somewhere
s = ['0'] + s
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d (+leading zero)' % (s, i, j, ji)