Çözüldü Fonksiyonlar asal sayı

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Ark_Us

Kilopat
Katılım
7 Nisan 2017
Mesajlar
848
Makaleler
1
Çözümler
7
Herkese merhaba; uygulama sorulardan bir tanesini anlayamadım tam olarak, kodları aşağıya bırakıyorum. Kodun çalışma şeklini 3 aşağı 5 yukarı anladım ama tam olarak anlayamadım.
Python:
 def asalSayıBulucu(sayı1 , sayı2):
   
#     for sayı in range(sayı1 , sayı2+1):
#         if sayı > 1:
#             for i in range(2 , sayı):
#                 if sayı % i == 0:
#                     break
#             else:
#                 print(sayı)

# sayı1 = int(input("sayı1 giriniz: "))
# sayı2 = int(input("sayı2 giriniz: "))

# asalSayıBulucu(sayı1 , sayı2)
 
Çözüm
Paylaştığın kod 2 sayı arasındaki asalları yazdırıyor. Daha rahat anlamak için bence sadece bir sayının asal olup olmadığına bakan koda bakmak iyi olacaktır.

flag değişkeni değişim olup olmadığını tutuyor. Başlangıç değeri sıfır olması için tanımladım.
Kod 2'den asal olup olmadığına bakacağımız num sayısının kareköküne kadar kontrol ediyor. Tam kontrolünü yapmadım ama +1 deyip o değere de bakması gerekiyor olabilir, orasına çok takılma. Neden karekökünü aldığımız önemli. Bir sayı asalsa tek çarpanı vardır, daha doğrusu 1 ve kendisi şeklinde iki çarpanı vardır. Asal değilse kareköküne kadar baktıktan sonra diğer çarpanı bulma ihtimalimiz yok, çünkü onun karşısına gelecek çarpanı bulmuş durumdayız.
num % i işlemi modunu alıyor. num / i işleminden kalanı hesaplanıyor yani. O değer sıfıra eşit ise o i sayısı num sayımızı tam bölmüş demektir. Bu durumda asal olamaz. O yüzden flag değerimizi artırıp not ediyoruz, break ile çıkıyoruz çünkü daha kontrol etmeye gerek yok.
Döngüden sonra flag değişkenimizin değerinin değişip değişmediğine bakıyoruz. Değişmişse asal değil, değişmemişse asal diyoruz. Aslında flag için true ve false da kullanılabilir.

Senin kodun ise dışdaki döngü ile bunu sayi1'den sayi2'ye kadar olan her sayı için yapıp duruyor. Asal ise yazdırıyor. Hatta Python'ın hoş bir özelliği kullanılmış, for-else. For döngüsünü break'e girmeden bitirdiyse else'e giriyor. Bu sayede break'e denk gelip gelinmediği anlaşılıyor.

Kod:
def asalMi(num):
    flag = 0

    for i in range(2, int(num**1/2)):
        if num % i == 0:
            flag += 1
            break
    
    if flag == 0:
        print(num, "sayısı asaldır.")

asalMi(5)
Paylaştığın kod 2 sayı arasındaki asalları yazdırıyor. Daha rahat anlamak için bence sadece bir sayının asal olup olmadığına bakan koda bakmak iyi olacaktır.

flag değişkeni değişim olup olmadığını tutuyor. Başlangıç değeri sıfır olması için tanımladım.
Kod 2'den asal olup olmadığına bakacağımız num sayısının kareköküne kadar kontrol ediyor. Tam kontrolünü yapmadım ama +1 deyip o değere de bakması gerekiyor olabilir, orasına çok takılma. Neden karekökünü aldığımız önemli. Bir sayı asalsa tek çarpanı vardır, daha doğrusu 1 ve kendisi şeklinde iki çarpanı vardır. Asal değilse kareköküne kadar baktıktan sonra diğer çarpanı bulma ihtimalimiz yok, çünkü onun karşısına gelecek çarpanı bulmuş durumdayız.
num % i işlemi modunu alıyor. num / i işleminden kalanı hesaplanıyor yani. O değer sıfıra eşit ise o i sayısı num sayımızı tam bölmüş demektir. Bu durumda asal olamaz. O yüzden flag değerimizi artırıp not ediyoruz, break ile çıkıyoruz çünkü daha kontrol etmeye gerek yok.
Döngüden sonra flag değişkenimizin değerinin değişip değişmediğine bakıyoruz. Değişmişse asal değil, değişmemişse asal diyoruz. Aslında flag için true ve false da kullanılabilir.

Senin kodun ise dışdaki döngü ile bunu sayi1'den sayi2'ye kadar olan her sayı için yapıp duruyor. Asal ise yazdırıyor. Hatta Python'ın hoş bir özelliği kullanılmış, for-else. For döngüsünü break'e girmeden bitirdiyse else'e giriyor. Bu sayede break'e denk gelip gelinmediği anlaşılıyor.

Kod:
def asalMi(num):
    flag = 0

    for i in range(2, int(num**1/2)):
        if num % i == 0:
            flag += 1
            break
    
    if flag == 0:
        print(num, "sayısı asaldır.")

asalMi(5)
 
Çözüm
Cevap için teşekkürler daha önce buna benzer bir uygulamam vardı tek fark true ve false kulanılmışdı onun çalışma şeklini bir şekilde öğrendim ama sizin atıgınız kodda.

For i in range(2, int(num**1/2)):

Muhtemelen yanlış okuyorum bu kısmı siz burada 1'in karesini alıp 2 bölmüşünüz galiba num orada ne yaptığını bilmiyorum
Benim yazdığım kodda bu bölümün Hatta Python'ın hoş bir özelliği kullanılmış, for-else. az daha ayrıntısına girmenizi rica ediyorum.
 
Num'un karekökünü almak istedim. Bu yüzden 1/2 üssünü aldım.

Merhaba muhtemelen bu yazıma geri dönmeyeceksiniz ama ben genede yazayım göndrdiğim kodu dikkatli inceledikten sora bir sorun gördüm şimdi kodu adan Z kadar anlatıp sizi boğmak yerine asıl sorunun olduğu yeri yazacağım.

Şimdi ben sayi1 girdisine 2 ve sayı2 girdisine 10 girdim gereken işlemler yapılınca 2 ci döngüye geliyor bizim ilk sayı 2 idi bizim 2ci döngü 2'den başlayacak sayıya kadar gidecek sorun da burada ben % işaretini bir sayıyı sürekli bölen ve kalanını gösteren bir oparatör olarak biliyorum ama bu uygulamada 2'nin modu 0(2%2=0)olmasına rağmen sanki kalanlı bölmüş gibi koşul sağlanmıyor bunun sebeni nedir? 1 sayısı kalan olarak mı sayılıyor?
 
Python:
# def asalSayıBulucu(sayı1 , sayı2):
    
#     for sayı in range(sayı1 , sayı2+1):
#         if sayı > 1:
#             for i in range(2 , sayı):
#                 if sayı % i == 0:
#                     break
#             else:
#                 print(sayı)

# sayı1 = int(input("sayı1 giriniz: "))
# sayı2 = int(input("sayı2 giriniz: "))

# asalSayıBulucu(sayı1 , sayı2)
 
Ben % işaretini bir sayıyı sürekli bölen ve kalanını gösteren bir oparatör olarak biliyorum ama bu uygulamada 2'nin modu 0 (2%2=0) olmasına rağmen sanki kalanlı bölmüş gibi koşul sağlanmıyor.
Kodda 2, 10 verince çalışıyor. 2, 3, 5, 7 cevabını veriyor.

El ile her adımı gidelim. for döngüsü var. sayı1'den sayı2 + 1'e kadar sayıyor. Aslında sayı2 dahil oluyor bu durumda. if sayı > 1 ifadesi var. Büyük, ilk değeri 2. Yine bir for döngüsü var. Bu sefer 2'den sayı'ya kadar olan sayılara bakıyor, sayı dahil değil. if sayı % i == 0 var. sayı'yı i'ye bölünce kalan sıfır mı diye kontrol ediyor. % (mod) işareti kalanı verir. Dıştaki döngüde sayı değişkenimizin ilk değeri 2 idi, içteki döngüde de i değişkenimizin ilk değeri 2. Bu durumda 2 % 2 işlemi sıfır döndürür. Yani if'in içine girer gibi duruyor. Siz böyle anladınız diye düşünüyorum. Ama sorun şu ki, içteki döngü 2'den sayı değişkenine kadar gidiyor. sayı değişkeninin ilk değeri zaten 2. Yani 2'den 2'ye gidiyor. Daha doğrusu gitmiyor. for döngüsü başlamadan bitti. Bittiği için else kısmına gidip sayıyı yazdırıyor.

Anlatabilmişimdir umarım.
Paragraf oluşturmak istesem de genel olarak alakalı oldukları için oluşturmadım. Bu yüzden fazla iç içe oldu.
 
Cevabınız için teşekkürler Bu durumda 2 % 2 işlemi sıfır döndürür. Yani if'in içine girer gibi duruyor. Siz böyle anladınız diye düşünüyorum doğru ben öyle anladım mantıken öyle olması gerekiyordu ama söylediginizde haklıydınız döngü denetleyecek başka sayı olmadığı için direk else in içine giriyor şimdi tam olarak anladım tekrardan teşekkürler.
 

Geri
Yukarı