Birçok insanın taşma hakkındaki soruyu yanıtladığını görüyorum, ancak orijinal sorununu ele almak istedim. Sorunun, tüm basamaklar tekrarlanmadan kullanılacak şekilde bir b = c bulmak olduğunu söyledi. Tamam, bu yazıda sorduğu şey bu değildi, ancak yine de sorunun üst sınırını incelemek ve asla bir taşmayı hesaplamak veya tespit etmek zorunda olmayacağı sonucuna varmak gerektiğini düşünüyorum (not: Yetkin değilim) matematikte adım adım yaptım, ama sonuç o kadar basitti ki basit bir formüle sahip olabilir).
Ana nokta, sorunun a, b veya c için gerektirdiği üst sınırın 98.765.432 olmasıdır. Her neyse, sorunu önemsiz ve önemsiz kısımlara bölerek başlayarak:
- x 0 == 1 (9, 8, 7, 6, 5, 4, 3, 2'nin tüm permütasyonları çözümdür)
- x 1 == x (çözüm mümkün değil)
- 0 b == 0 (çözüm mümkün değil)
- 1 b == 1 (çözüm mümkün değil)
- a b , a> 1, b> 1 (önemsiz değil)
Şimdi sadece başka bir çözümün mümkün olmadığını ve sadece permütasyonların geçerli olduğunu göstermeliyiz (ve sonra bunları yazdırmak için kod önemsizdir). Üst sınırlara geri dönüyoruz. Aslında üst sınır c = 98.765.432'dir. Üst sınır, çünkü 8 basamaklı en büyük sayıdır (her a ve b için toplam 10 basamak eksi 1). Bu üst sınır sadece c içindir, çünkü a ve b için sınırlar üstel büyüme nedeniyle çok daha düşük olmalıdır, çünkü hesaplayabildiğimiz gibi, b'yi 2'den üst sınıra değiştirir:
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
Dikkat edin, örneğin son satır: 1.97 ^ 27 ~ 98M diyor. Yani, örneğin, 1 ^ 27 == 1 ve 2 ^ 27 == 134.217.728 ve bu bir çözüm değil, çünkü 9 haneye sahip (2> 1.97, bu yüzden gerçekten test edilmesi gerekenden daha büyük). Görüldüğü gibi, a ve b'yi test etmek için mevcut kombinasyonlar gerçekten küçüktür. B == 14 için, 2 ve 3'ü denememiz gerekir. B == 3 için, 2'den başlayıp 462'de dururuz. Tüm sonuçlar ~ 98M'den azdır.
Şimdi yukarıdaki tüm kombinasyonları test edin ve herhangi bir rakam tekrarlamayanları arayın:
['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)
Hiçbiri problemle uyuşmuyor ('0', '1', ..., '9' yokluğunda da görülebilir).
Bunu çözen örnek kod aşağıdadır. Ayrıca, Python'da yazıldığını unutmayın, keyfi hassas tamsayılara ihtiyaç duyduğu için değil (kod 98 milyondan daha büyük bir şey hesaplamıyor), ancak test miktarının çok küçük olduğunu öğrendiğimiz için, yüksek seviyeli bir dil kullanmalıyız. yerleşik kapsayıcılarından ve kitaplıklarından yararlanın (ayrıca not: kodun 28 satırı vardır).
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)