Bu kod 17.ve 31. satırda hata veriyor.Kendimce ebob bulma programı yapmaya çalıştım.Neden hata veriyor acaba?

def ebobbulma(a,b):
    liste1 = []
    liste2 = []

    for i in range(2,a):
        if a % i ==0:
            liste1.append(i)
    for c in range(2,b):
        if b % c ==0:
            liste2.append(c)
    liste1.reverse()
    liste2.reverse()
    while True:

        if liste1[0] != liste2[0]:
            liste1.pop(0)
            liste2.pop(0)
        elif liste1[0] == liste2[0]:
            break
    return liste1,liste2




while True:
    a = int(input("1.sayı:"))
    b = int(input("İkinci sayı"))

    print(ebobbulma(a,b))
1 Beğeni
Traceback (most recent call last):
  File "C:\Users\Berke Balcı\PycharmProjects\pythonProject\Fonksiyonlar\Sayının Ebobu.py", line 31, in <module>
    print(ebobbulma(a,b))
  File "C:\Users\Berke Balcı\PycharmProjects\pythonProject\Fonksiyonlar\Sayının Ebobu.py", line 17, in ebobbulma
    if liste1[0] != liste2[0]:
IndexError: list index out of range

Arada boşluk var o yüzden 31 tane satır var yani pycharm öyle gösteriyor.

Şunu dener misiniz :

sayi = int(input("1. sayı : "))

sayi2= int(input("2. sayı : "))

liste = list()

def ebob_bul(sayı1,sayı2):
    i = 1
    ebob = 1

    while i <= sayi and i <= sayi2:
        if not sayi % i and not sayi2 % i:
            ebob = i

        i += 1

    return ebob

print("Ebob : ",ebob_bul(sayi,sayi2))

Listelerin biri boş ([]) ve ilk indeksi yok.

Ama append metodu ile ekleme yapmıyor mu?

Evet attığınız kod çalışıyor ama benim kodumda listeme boş diyor.Ben for döngüsünde append metodu ile listeye eleman eklemeye çalıştım.Neden eklenmedi acaba

append'ler for döngüsünün ve if’in içinde, çağırılmayacakları durumlar var.

yani for döngüsünün içinde if kullandığımızda mı çağıramıyoruz.Biraz daha açıklar mısınız

Bu kodda print var ama çağırılmıyor:

if 1 == 0:
    print("Hello world")

Buradaki de çağırılmıyor:

for i in range(2, 2):
	print(i)

yani fonksiyon bloğunun başına sayi1 ve sayi2 nin 1 ve 2 ollma durumlarını da mı yazmalıyım?

Bilmiyorum, nasıl bir algoritma kullandığınızı anlamadım.

Fonksiyonun içinde listeleri ekrana yazdırarak sorunu bulmaya çalışın.

Merhaba, sanırım yapmaya çalıştığınız şeyi anladım. liste1 ve liste2 'ye sayının bölenlerini atıyorsunuz. sonra listeleri ters çevirerek listeyi büyükten küçüğe doğru sıralı hale getiriyorsunuz. Daha sonra ise iki listede de bulunan en büyük sayıyı bulmaya çalışıyorsunuz.

def ebobbulma(a,b):
    liste1 = []
    liste2 = []

    for i in range(1,a):
        if a % i ==0:
            liste1.append(i)
    for c in range(1,b):
        if b % c ==0:
            liste2.append(c)
    liste1.reverse()
    liste2.reverse()
    while True:

        if liste1[0] > liste2[0]:
            liste1.pop(0)
        elif liste1[0] < liste2[0]:
            liste2.pop(0)
        elif liste1[0] == liste2[0]:
            break
    return liste1,liste2




while True:
    a = int(input("1.sayı:"))
    b = int(input("İkinci sayı"))

    print(ebobbulma(a,b))

Bunu bir deneyebilir misiniz?
Değişiklikler:
for i in range(2,a): yerine for i in range(1,a):
for i in range(2, b): yerine for i in range(1,b):

Çünkü 1 de bir bölendir.

Sonra:

        if liste1[0] != liste2[0]:
            liste1.pop(0)
            liste2.pop(0)

yerine

        if liste1[0] > liste2[0]:
            liste1.pop(0)
        elif liste1[0] < liste2[0]:
            liste2.pop(0)

Bakalım olacak mı?

Edit: öklit algoritmasını da incelemenizi öneririm.
Edit2: editlediğim kodu denemedim.

1 Beğeni

Teşşekkür ederim aynen dediğiniz gibi bir mantık oluşturdum ve kodunuz çalışıyor yalnız asal sayılar için range(2,sayi) yerine (1,sayı) kullanmalıyım ve return liste1[0] yazmalıyım

Rica ederim.

Mesela 15 ile 61 in ebobu 1 dir. O 1 bunun için. Yoksa hem algoritma yanlış çalışır hem de kod hata verir. O yüzden yani.

Aynen öyle.

İy geceler dilerim.

İyi geceler sizede mesajınızı görmemişim kusura bakmayın:)

1 Beğeni

list1 = [5,3,2] ve list2 = [7,5,3] olduğunu varsayalım. Karşılaştırmalı yaptıktan sonra (yani list1[0] ve list2[0] karşılaştırması dan sonra) list1[0] ve list2[0] elemanlarını siliyorsun. Dolayısı ile en büyük ortak bölen 5 değerini list1 den çıkarmış oluyorsun. Argoritman bu haliyle doğru çalışmamış oluyor. list1 in tüm elemanlarını 2 for kullanarak list2 nin tüm elemanlarıyla karşılaştırman lazım.
Diğer yorumları çok detaylı okumadım ama, küçük bir not düşmekte fayda var.
1-Asal sayıları bulmaya çalışırken range(2,sayi**0.5 + 1) e kadar gitmek yeterli.
2-Sayının bölenlerini bulmak için range(2,sayi/2 +1)e kadar gitmek yeterli.

Teşşekkür ederim anladım.