Mükemmel Sayı Bulma programı yardım!

Selamın aleyküm arkadaşlar. Kolay gelsin. Aranızda yeniyim. Pythona yeni başladım.Başlıkta okumuş olduğunuz gibi bir program yazmak için uğraştım ancak algoritmayı tam kuramadım. haliyle hangi kodları da yazacağımı bilmiyorum…Yardımcı olabilecek var mı?

Neyin mükemmel sayısını bulmak istiyorsunuz?

Mükemmel sayı bulan bir fonksiyonu istiyor

Sayı neye göre mükemmel?

Mükemmel sayı, sayılar teorisinde, kendisi hariç pozitif tam bölenlerinin toplamı kendisine eşit olan sayı. Diğer bir ifadeyle, bir mükemmel sayı, bütün pozitif tam bölenlerinin toplamının yarısına eşittir. Vikipedi

1 Beğeni

Daha detaylı açıklayabilir misin?

6 gibi 1+2+3 anladinmi

Aleyküm selam.

Mükemmel sayıları kolayca bulmak için normalde bir formül kullanılıyor, siz teker teker deneyecek bir algoritma yazmak mı istiyorsunuz?

Ne yazık ki elimde bilgisayar olmadığından ötürü algoritmasından bahsedebilirim.

Sayı kendisi hariç tüm pozitif bölenlerini alıp topluyor kendisine eşit mi kontrol ediyor.

1- Kullanıcıdan bir sayı alınır.
2- Eğer sayı 1 e eşitse direk bitirin.
3- Sayı 1 e eşit değilse döngüyü 1 den başlayıp sayıya kadar döngüye alın.
4- Eğer verilen sayı ile döngünün değişkeninin kalanı 0 ise bir liste oluşturabilirsiniz veya herhangi bir counter 0 değerini tutar buna eklersiniz.
5- Son olarak girilen sayı değeri ile counter eşit mi bakılır.

sayi = int(input("Sayi giriniz"))
bolenler = []


if sayi != 1:
	for i in range(1,sayi):
		if sayi % i == 0:
			bolenler.append(i)
		else:
			pass
			
if sum(bolenler) == sayi:
	print("Mukemmel sayi")

Normalde daha güzel yazılabilir ama telefon üzerindeyim ve tam olarak anlaşılması için bu şekilde olabilir.

Bölen sayıların hepsini gormeniz için bolenler listesi oluşturdum.

1 Beğeni

Teşekkürler algoritmayı bulmuştum ama o kadar basit bir mantık hatası yapmışım ki mükemmel sayı olan 6 nın => 6/1 işleminden kalan sayı var zannediyorum bu yüzden ( msayı % i == 0 ) kodunu aklıma gelmesine rağmen yazmadım. :sweat_smile: :sweat_smile: bu yüzden çok uzun yollar denedim. sonra szin yanıtınızı okuyunca ne kadar da bebekçe bir hata yaptığımı anladım. sonra kahkaha ile güldüm…:smiley:
ilgisi ola herkese teşekkür ederim…:smiley:

Bir de şu algoritmayı kullanırsak mükemmel sayıları çok daha hızlı bulabiliriz:

asallar = [2, 3, 5]

def asal_mı(n):
    k = asallar[-1] + 2
    for i in range(k, n, 2):
        for asal in asallar:
            if not i % asal:
                break
        else:
            asallar.append(i)
    for asal in asallar:
        if not n % asal:
            return False
    asallar.append(n)
    return True
            
print(6) # işlemi hızlı yapmak uğruna oluşan bir istisna
for i in range(1000):
    n = asallar[i]
    p = 2**n -1
    if asal_mı(p):
        print(2**(n-1) * p)

Vaktin çoğunun asal sayıları bulmaya gittiğini göz önünde bulundurup bir kütüphaneden yardım alırsak daha da iyi olur:

from sympy import prime, primetest
            
for i in range(1, 1000):
    n = prime(i)
    p = 2**n -1
    if primetest.isprime(p):
        print(2**(n-1) * p)