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))
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.
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:)
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.