Python ile “Digit Faktöriyel” Olan Sayıları Bulma
Bu yazımızda, Python ile 100000’in altındaki “dijit faktöriyel” olan sayıları listeleyen örnek bir program yazacağız.
Kodumuzu yazmaya geçmeden önce digit faktöriyelin ne olduğunu açıklayalım; digit faktöriyel, rakamlarının faktöriyelleri toplamı yine kendisine eşit olan sayılara denilmektedir. Buna göre, 145 sayısı için 1! + 4! + 5! = 1+24+120 = 145 olduğundan 145 sayısı digit faktöriyeldir. Ancak belirtmek isterim ki, 1 ve 2 sayıları ilgili şartı sağlamalarına rağmen digit faktoriyel olarak değerlendirilmez.
from math import factorial
def digit_factorials(max_limit):
"""
Belirli bir üst sınırın altındaki tüm sayıları bulan fonksiyon tanımladık
Rakamlarının faktöriyellerinin toplamı sayının kendisine eşittir.
1 ve 2 bu kapsam dışında tutulmuştur.
"""
digit_factorial_numbers = [] # Digit faktöriyel sayılarını saklamak için bir liste
for number in range(10, max_limit): # 10'dan başlayarak max_limit'e kadar olan tüm sayıları kontrol eder
sum_of_factorials = sum(factorial(int(digit)) for digit in str(number)) # Sayının her bir rakamının faktöriyelini hesaplar ve toplar
if sum_of_factorials == number: # Eğer rakamlarının faktöriyellerinin toplamı kendisine eşitse
digit_factorial_numbers.append(number) # Bu sayıyı listeye ekler
return digit_factorial_numbers
# 100000'den küçük digit faktöriyel sayıları bulma
digit_factorial_numbers = digit_factorials(100000)
print(digit_factorial_numbers)
Kodu Trinket üzerinden çalıştırarak inceleyebilirsiniz. Kodumuzun daha da anlaşılır olması adına neyi niye yaptığımızı maddeler halinde açıklayalım:
- Fonksiyon Tanımı (
def digit_factorials(max_limit)
): Özel bir özelliğe sahip sayıları bulmak için yeniden kullanılabilir bir fonksiyon tanımladık. Bu fonksiyon,max_limit
parametresi alır ve bu sınırın altındaki tüm “digit faktöriyel” sayıları bulur. - Digit Faktöriyel Sayılar Listesi (
digit_factorial_numbers = []
): Fonksiyonun çalışması sırasında bulunan “digit faktöriyel” sayıları saklamak için liste kullandık. - Dış Döngü (For Döngüsü):
for number in range(10, max_limit):
ile, 10’dan (1 ve 2 hariç tutulduğu için başlangıç 10’dur)max_limit
parametresine kadar olan tüm sayıları for döngüsü ile tek tek kontrol ediyoruz. - Rakamların Faktöriyellerinin Toplanması: Her bir sayının rakamlarını ayrı ayrı alıp (
for digit in str(number)
) her birinin faktöriyelini hesaplayarak (factorial(int(digit))
) topluyoruz (sum_of_factorials = sum(factorial(int(digit)) for digit in str(number))
). - Digit Faktöriyel Olup Olmadığının Kontrolü: Eğer bir sayının rakamlarının faktöriyellerinin toplamı kendisine eşit mi diye kontrol etmek için if koşulunu kullandık (
if sum_of_factorials == number:
) ve eğer öyleyse append metodu ile listeye ekledik (digit_factorial_numbers.append(number)
). sum_of_factorials = sum(factorial(int(digit)) for digit in str(number))
ifadesi biraz karışık görülebilir. O yüzden bu kısmı da es geçmek istemedim:str(number)
: Önceliklenumber
değişkeni, sayısal bir değeri temsil etmektedir. Bu sayıyıstr()
fonksiyonu ile bir string’e çeviriyoruz. Böylece, sayının her bir rakamını ayrı ayrı işlemek mümkün hale gelmektedir. Örneğin,number
145 ise,str(number)
ifadesi'145'
olur.for digit in str(number)
: Bu döngü,number
sayısının her bir rakamını (digit
) sırayla alır ve işler. Bu döngü, örneğin ‘145’ için üç kez çalışır: ilk önce ‘1’ için, sonra ‘4’ için ve en son ‘5’ için çalışır.int(digit)
: Her birdigit
(rakam), şu anda bir string’dir. Örneğin, ‘1’, ‘4’, ‘5’. Bu rakamları işleyebilmek için onları tekrar integer’a (tam sayıya) çevirmemiz gerekmektedir. Yaniint('1')
ifadesi 1’e,int('4')
ifadesi 4’e, veint('5')
ifadesi 5’e dönüşür.factorial(int(digit))
: Her bir rakamın faktöriyelini alıyoruz. Örneğin,factorial(1)
,factorial(4)
, vefactorial(5)
.sum(... for digit in str(number))
: Tüm bu faktöriyel hesaplamalarının sonuçlarını topluyoruz. Yani,1! + 4! + 5!
ifadesinin sonucunu hesaplıyoruz.sum_of_factorials
: Tüm bu işlemlerin sonucu,sum_of_factorials
değişkenine atanır. Bu değişken,number
sayısının rakamlarının faktöriyellerinin toplamını temsil eder. Bu işlem, her bir sayı içinfor number in range(10, max_limit):
döngüsü içinde tekrarlanır.