Python ile Armstrong Sayıları: Nedir ve Nasıl Bulunur?

Matematik dünyasının en merak uyandırıcı konularından biri olan “Armstrong Sayıları” (veya diğer adıyla Narsistik Sayılar), programlama mantığını geliştirmek için harika bir egzersizdir. Bu yazımızda, Python kullanarak bir sayının Armstrong sayısı olup olmadığını nasıl kontrol edebileceğimizi ve geniş bir sayı aralığındaki tüm Armstrong sayılarını nasıl listeleyebileceğimizi detaylıca inceleyeceğiz.

🧐 Armstrong Sayısı Nedir?

Bir sayının, kendi basamak sayısındaki kuvvetlerinin toplamına eşit olması durumuna Armstrong Sayısı denir.

Örneklerle Açıklayalım:

  1. 3 Basamaklı Bir Örnek: 153
  • Basamak sayısı: 3
  • Hesaplama: $1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153$
  • Sonuç: 153 orijinal sayıya eşit olduğu için bir Armstrong sayısıdır.
  1. 4 Basamaklı Bir Örnek: 9474
  • Basamak sayısı: 4
  • Hesaplama: $9^4 + 4^4 + 7^4 + 4^4 = 6561 + 256 + 2401 + 256 = 9474$
  • Sonuç: 9474 orijinal sayıya eşit olduğu için bir Armstrong sayısıdır.

💻 Python ile Uygulama

Bu problemi çözmek için izleyeceğimiz mantık oldukça basittir: sayıyı analiz edilebilir bir formata getirmek, her bir basamağı tek tek işlemek ve toplamı orijinal sayı ile karşılaştırmak.

Algoritma Adımları

  1. Sayıyı String’e Dönüştürme: Sayının kaç basamaklı olduğunu kolayca bulmak ve her basamağa tek tek erişebilmek için sayıyı metin (str) tipine çeviriyoruz.
  2. Kuvvet Hesaplama: Basamak sayısını belirledikten sonra, her bir basamağı bu sayıya yükseltiyoruz.
  3. Toplamayı Biriktirme: Hesaplanan değerleri bir toplam değişkeninde topluyoruz.
  4. Karşılaştırma: Elde edilen toplam, orijinal sayıya eşitse sayı bir Armstrong sayısıdır.

Tam Kod Paylaşımı

İşte 0’dan 100.000’e kadar olan tüm Armstrong sayılarını bulan optimize edilmiş Python kodumuz:

"""
Author: Ahmet Aksoy
Date: 2026-04-16
Python 3.12 - Ubuntu 24.04
"""

def is_armstrong(n):
    # Sayıyı stringe çevirerek basamak sayısını ve her bir rakamı alıyoruz
    nums = str(n)
    digits = len(nums)
    total_sum = 0

    for digit_char in nums:
        # Karakteri tekrar sayıya çevirip basamak sayısı kadar kuvvetini alıyoruz
        d = int(digit_char)
        total_sum += d ** digits

    # Toplam, orijinal sayıya eşitse True, değilse False döner
    return total_sum == n

def main():
    print("Armstrong Sayıları Hesaplanıyor... \n")
    # 0 ile 100.000 arasındaki sayıları kontrol edelim
    for number in range(0, 100000):
        if is_armstrong(number):
            print(f"Bulundu: {number}")

if __name__ == "__main__":
    main()

🛠️ Kodun Detaylı Analizi

Neden str() Kullandık?

Python’da bir sayının basamaklarına erişmenin iki yolu vardır: matematiksel modülo (%) operatörü kullanmak veya sayıyı string’e çevirmek. String yöntemi, özellikle değişken basamak sayısına sahip problemlerde çok daha okunaklı ve hızlı geliştirilebilir bir yol sunar.

Zaman ve Alan Karmaşıklığı

  • Zaman Karmaşıklığı: $O(N \cdot D)$’dir. Burada $N$ kontrol edilen sayı miktarı, $D$ ise sayıların ortalama basamak sayısıdır.
  • Alan Karmaşıklığı: $O(D)$’dir. Sadece sayının string temsili için gereken küçük bir alan kullanılır.

🎯 Sonuç

Armstrong sayılarını bulmak, programlamaya yeni başlayanlar için döngüler, veri tipi dönüşümleri ve temel matematiksel operatörlerin kullanımını pekiştiren mükemmel bir projedir. Bu mantığı geliştirebilir ve örneğin “Sadece belirli bir basamak sayısındaki Armstrong sayılarını bul” gibi yeni özellikler ekleyerek kendinizi geliştirebilirsiniz.

Siz de kendi projelerinizde bu tarz matematiksel meydan okumaları deneyerek Python bilginizi derinleştirebilirsiniz!

Ahmet Aksoy

Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir