Çözüldü Mükemmel sayı mantık hatası

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
28 Kasım 2014
Mesajlar
3.557
Çözümler
58
Programimin mukemmel sayilari bulan kisminda bir mantik hatasi var, fazladan bir tane mukemmel sayi buluyor. Dil Python.

Python:
def tambolen():
menzil = input('Bir menzil giriniz: ')
menzil = int(menzil)
tambolenleri = [] #tam bolen listesi.
tambolenleri_top = 0.
muk = [] #Mukemmel sayi listesi.

for herbir_sayi in range(1, menzil+1): #Menzildeki her bir sayiyi ele al.
for her_bolen in range(1,herbir_sayi): #Ele alinan sayiya kadar.
if herbir_sayi % her_bolen == 0: #tam boleni kontrol et.
tambolenleri.append(her_bolen) #tam bolense listeye ekle.

for top in tambolenleri: #Tam bolen listesindeki elemanlari al.
tambolenleri_top += top #Hepsini topla.
if tambolenleri_top == herbir_sayi:
muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.

tambolenleri_top = 0 #Yeni bir sayi icin tam bolenlerin toplamini temizle.
tambolenleri.clear() #Yeni bir sayi icin tam bolenlerin listesini temizle.

print(muk)
tambolen()

Menzil olarak 100 verince 3 cikti vermesi gerekirken 4 tane veriyor.
 
Çözüm
@deleted
Kod aşağıdaki gibi olduğunda tüm sayılar toplanmadan her seferinde kontrol ediyor ve döngü bittiğinde tüm sayılar toplanmadan son kontrol yapılmış oluyor bu yüzden değerler hatalı çıkıyor.

Python:
  for top in tambolenleri: #Tam bolen listesindeki elemanlari al.

      tambolenleri_top += top #Hepsini topla.

      if tambolenleri_top == herbir_sayi:

        muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.


Eğer ki kod bu şekilde olursa tambolenleri_top'lamına tüm değerler eklenmiş oluyor ve son olarak kontrolünü yapıyor değerler bu yüzden doğru çıkıyor.
Kod:
    for top in tambolenleri: #Tam bolen listesindeki elemanlari al.

      tambolenleri_top += top #Hepsini topla.

    if tambolenleri_top == herbir_sayi:

     muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.
@deleted Kodunuzda hiçbir hata yok sadece boşlukları doğru yapmamışsınız. Python'u bu yüzden sevmiyorum 😒.
Python:
def tambolen():
  menzil = input('Bir menzil giriniz: ')
  menzil = int(menzil)
  tambolenleri = [] #tam bolen listesi.
  tambolenleri_top = 0.
  muk = [] #Mukemmel sayi listesi.
  for herbir_sayi in range(1, menzil+1): #Menzildeki her bir sayiyi ele al.
    for her_bolen in range(1,herbir_sayi): #Ele alinan sayiya kadar.
      if herbir_sayi % her_bolen == 0: #tam boleni kontrol et.
       tambolenleri.append(her_bolen) #tam bolense listeye ekle.
    for top in tambolenleri: #Tam bolen listesindeki elemanlari al.
      tambolenleri_top += top #Hepsini topla.
    if tambolenleri_top == herbir_sayi:
     muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.
    tambolenleri_top = 0 #Yeni bir sayi icin tam bolenlerin toplamini temizle.
    tambolenleri.clear() #Yeni bir sayi icin tam bolenlerin listesini temizle.
  print(muk)
tambolen()
 
Son düzenleme:
Merhaba, boşluklar aslında var fakat buraya kopyalarken çıkmamış. Resim olarak atayım:
Ekran Görüntüsü (1).png


@HABAR satırı kontrol ettim fakat çözemedim. Bir sorun yok gibi görünüyor.
 
@deleted
Kod aşağıdaki gibi olduğunda tüm sayılar toplanmadan her seferinde kontrol ediyor ve döngü bittiğinde tüm sayılar toplanmadan son kontrol yapılmış oluyor bu yüzden değerler hatalı çıkıyor.

Python:
  for top in tambolenleri: #Tam bolen listesindeki elemanlari al.

      tambolenleri_top += top #Hepsini topla.

      if tambolenleri_top == herbir_sayi:

        muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.


Eğer ki kod bu şekilde olursa tambolenleri_top'lamına tüm değerler eklenmiş oluyor ve son olarak kontrolünü yapıyor değerler bu yüzden doğru çıkıyor.
Kod:
    for top in tambolenleri: #Tam bolen listesindeki elemanlari al.

      tambolenleri_top += top #Hepsini topla.

    if tambolenleri_top == herbir_sayi:

     muk.append(herbir_sayi) #Toplam sayiya esitse mukemmel listesine ekle.
 
Son düzenleme:
Çözüm
Uyarı! Bu konu 6 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı