Oldukça hızlı çalışan bir Python kodu yazdım:
for n in range(2, 22):
for x in range(n, 9*n + 1 ):
m = (x-n)**n
y = sum(int(digit) for digit in str(m))
z = len(str(m))
if x == y and n == z :
print(m)
Çıktı olarak:
25
64
125
216
343
değerlerini veriyor. Yani istene özellikte beş tane sayı vardır. Bunlar $25, 64, 125, 216, 343$ sayılarıdır. Kodların görevlerinin matematiksel açıklamlarını verebiliriz:
for n in range(2, 22):
kodu ile $n$ değişkenini $2$'den başlatıp $21$'e kadar ($22$ dahil değildir) sırasıyla değiştiriyoruz. Yani $n=2, 3, \dots ,21$ değerlerini alacak. Bunlar bizim $m$ sayımızın basamak sayısıdır. Sonra
for x in range(n, 9*n + 1 ):
kodu ile $x$ değişkenini $n$'den $9n$'e kadar değiştiriyoruz. Bu bizim $m$ sayımızın rakamlarının toplamının alabileceği olası değerlerdir. Örneğin $n=2$ basamaklı bir $m$ sayısı için rakamlar toplamı $x=2,3, \dots 18$ değerlerini alabilir. Problemin koşulundan dolayı $x-n$ bir pozitif tam sayı olmalıdır. Bu sebeple $x$'i $1$'den değil $n$'den başlatıyoruz.
m = (x-n)**n
kodu ile $m$ sayımızı $m=(x-n)^n$ biçiminde tanımlıyoruz. Bu türdeki sayıları üretiyoruz. Sonra
y = sum(int(digit) for digit in str(m))
z = len(str(m))
kodları ile sırasıyla $m$'nin rakamlarının toplamını ve $m$'nin basamak sayısını hesaplatıyoruz. Son adımda da
if x == y and n == z :
print(m)
kodu ile $x=y$ ($m$'nin basamaklarındaki rakamların toplamının gerçekten $x$'e eşit olabilmesi) koşulu ve $n=z$ ($m$'nin basamak sayısının gerçekten $n$'e eşit olabilmesi) koşulunu sağlayan $m$ sayılarını yazdırıyoruz. Hepsi bu kadar.