Python'da asal sayı testinde hata çıkıyor

4nd1z

Decapat
Katılım
25 Kasım 2021
Mesajlar
115
Daha fazla  
Cinsiyet
Erkek
Python:
def carpan():
    girdi=input("lütfen bir sayı giriniz")
    lenght=len(girdi)
    negatif=""
    # girdinin ilk karakteri - değilse önce sayı mı değil mi diye kontrol eder, değilse fonksiyonu başlatır ama sayıysa çıktısını verir
    if not girdi[0]=="-":
        if not str.isdigit(girdi):
            carpan()
        else:
            for i in range(1,int(girdi) +1):
                if int(girdi) % i==0:
                    print(i)
                    print(-i)
    # ilk karakter - ise
    else:
        # ilk karakter - olduğu için önemsemeyip - den sonrakileri başka, boş bir değişkene atar
        for t in range(1,lenght +1):
            negatif=negatif+girdi[t]
            # - den sonraki karakterin bir tanesi bile isdigit e uymazsa fonksiyonu yineler
            if not str.isdigit(negatif):
                carpan()
            else:
                    # sayının - karakteri olmayan halinin çarpanını bulmaya çalışır
                    for b in range(1, int(girdi.strip("-"))+1):
                        if int(girdi.strip("-")) % b==0:
                            print(b)
                            print(-b)

Arkadaşlar merhaba, burada asal sayı testi yapmaya çalıştım ama bu fonksiyonun çok aptalca bir sorunu var. -10 ve -10 dan küçük değer girince iki kez aynı işlemi yapıyor. Bunun olmasını nasıl önlerim. Bir de negatif sayı girince çıktıyı sayı aralığına göre bir veya iki kez veriyordu ya üstüne ek olarak 18. satırdaki işlemimi gösterip "IndexError: string index out of range" diyor. (ama o 18. satırdaki işlemin benzerini dışarda bir yerde yapınca normal bir şekilde çalışıyor)
Bu fonksiyonda radikal bir değişiklik yapmadan nasıl düzeltebiliriz. (Biraz level 1 seviyesindeyim belki önerdiğiniz çözüm yollarını bilmiyor olabilirim affedin)

negatif girince aldığım hata:

1646331827837.png

Aptallığım için çok özür dilerim asal sayı değil, çarpan testi olacaktı
 
Son düzenleme:
17. satırda ,lenght +1 yerine -1 olması gerekiyor. İndeksler 0'dan başladığı için uzunluğun bir eksiğine kadar for döngüsüyle gezebilirsin harfleri. Bu sınırı aşarsan index out of range hatası alırsın.

17. Satır doğru hali:
Python:
for t in range(1,lenght -1):
 
Son düzenleme:
17. satırda ,lenght +1 yerine -1 olması gerekiyor. İndeksler 0'dan başladığı için uzunluğun bir eksiğine kadar for döngüsüyle gezebilirsin harfleri. Bu sınırı aşarsan index out of range hatası alırsın.

17. Satır doğru hali:
Python:
for t in range(1,lenght -1):
Hocam ama öyle yaparsam kullanıcının girdiği yazının son 2 karakterini 20. Satırdaki if not str. ile başlayan koda okutmamış olmuyor muyum. Mesela 1980 girersek 8 ve 0 ın sayı olup olmadığını test etmemiş olmaz mı?
 
Python:
def carpan():
    girdi=input("lütfen bir sayı giriniz")
    lenght=len(girdi)
    negatif=""
    # girdinin ilk karakteri - değilse önce sayı mı değil mi diye kontrol eder, değilse fonksiyonu başlatır ama sayıysa çıktısını verir
    if not girdi[0]=="-":
        if not str.isdigit(girdi):
            carpan()
        else:
            for i in range(1,int(girdi) +1):
                if int(girdi) % i==0:
                    print(i)
                    print(-i)
    # ilk karakter - ise
    else:
        # ilk karakter - olduğu için önemsemeyip - den sonrakileri başka, boş bir değişkene atar
        for t in range(1,lenght +1):
            negatif=negatif+girdi[t]
            # - den sonraki karakterin bir tanesi bile isdigit e uymazsa fonksiyonu yineler
            if not str.isdigit(negatif):
                carpan()
            else:
                    # sayının - karakteri olmayan halinin çarpanını bulmaya çalışır
                    for b in range(1, int(girdi.strip("-"))+1):
                        if int(girdi.strip("-")) % b==0:
                            print(b)
                            print(-b)

Arkadaşlar merhaba, burada asal sayı testi yapmaya çalıştım ama bu fonksiyonun çok aptalca bir sorunu var. -10 ve -10 dan küçük değer girince iki kez aynı işlemi yapıyor. Bunun olmasını nasıl önlerim. Bir de negatif sayı girince çıktıyı sayı aralığına göre bir veya iki kez veriyordu ya üstüne ek olarak 18. satırdaki işlemimi gösterip "IndexError: string index out of range" diyor. (ama o 18. satırdaki işlemin benzerini dışarda bir yerde yapınca normal bir şekilde çalışıyor)
Bu fonksiyonda radikal bir değişiklik yapmadan nasıl düzeltebiliriz. (Biraz level 1 seviyesindeyim belki önerdiğiniz çözüm yollarını bilmiyor olabilirim affedin)

negatif girince aldığım hata:

Eki Görüntüle 1321777
Aptallığım için çok özür dilerim asal sayı değil, çarpan testi olacaktı
Merhaba,
Fikrimce yer yer gördüğüm hataları söyleceğim.

Öncelikle input'u integer olarak almanı tavsiye ederim - sayı koşulunuda sıfırdan küçük mü şeklinde kontrol edebilirsin.

length değişkeninde aldığın inputun uzunluğunu tutuyorsun. 4 harfli bir string'in length'i 4 tür fakat index hesabında sıfırdan başladığı için son index'i 3 tür. 17.satırda açtığın döngüde length + 1 yerine length demelisin.

Tekrardan bastırma hatası 18.satırda açtığın döngüden kaynaklanıyor. Girdiğin rakam kaç basamaklı ise öyle bir döngü açıyorsa ve o döngünün içinde bir döngü daha açmışsın o döngüde de hesaplamayı yapıyorsun. Bunun yerine 18.satırdaki döngüyü kaldırıp 24.satırdaki döngüyü sadece kullanıp diğer işlemleride o döngü içerisinde yapmalısın şeklinde görüyorum. Belki biraz daha farklı olabilir ama tekrar etmesinin sebebi bu.

Bir de kodu çok karmaşık yazmışsın gibi geldi daha basit düşünerek önce kurgulayarak yazman daha iyi olur benim fikrimce. Ben henüz programlama öğrenirken problemi hiç kod yazmadan bir matematik problemi gibi ama bir insan gibi değil nasıl çözerim diye düşünürdüm. Örneğin bir sayının asal sayı olup olmadığını anlamak için o sayının yarısına kadar olan kısımdaki hiçbir sayıya bölünemiyorsa asal sayıdır. Bunu kodlamadan önce ne yapman gerektiğini kurgalıyıp yazsan daha iyi olur.
 
Merhaba,
Fikrimce yer yer gördüğüm hataları söyleceğim.

Öncelikle input'u integer olarak almanı tavsiye ederim - sayı koşulunuda sıfırdan küçük mü şeklinde kontrol edebilirsin.

length değişkeninde aldığın inputun uzunluğunu tutuyorsun. 4 harfli bir string'in length'i 4 tür fakat index hesabında sıfırdan başladığı için son index'i 3 tür. 17.satırda açtığın döngüde length + 1 yerine length demelisin.

Tekrardan bastırma hatası 18.satırda açtığın döngüden kaynaklanıyor. Girdiğin rakam kaç basamaklı ise öyle bir döngü açıyorsa ve o döngünün içinde bir döngü daha açmışsın o döngüde de hesaplamayı yapıyorsun. Bunun yerine 18.satırdaki döngüyü kaldırıp 24.satırdaki döngüyü sadece kullanıp diğer işlemleride o döngü içerisinde yapmalısın şeklinde görüyorum. Belki biraz daha farklı olabilir ama tekrar etmesinin sebebi bu.

Bir de kodu çok karmaşık yazmışsın gibi geldi daha basit düşünerek önce kurgulayarak yazman daha iyi olur benim fikrimce. Ben henüz programlama öğrenirken problemi hiç kod yazmadan bir matematik problemi gibi ama bir insan gibi değil nasıl çözerim diye düşünürdüm. Örneğin bir sayının asal sayı olup olmadığını anlamak için o sayının yarısına kadar olan kısımdaki hiçbir sayıya bölünemiyorsa asal sayıdır. Bunu kodlamadan önce ne yapman gerektiğini kurgalıyıp yazsan daha iyi olur.
Yanıtın için teşekkür ederim, başka yöntemlere baktığımda dediğiniz gibi int(girdi) yapıp onun kontrolünü sağlasaymışım daha basit olurmuş. Hoca şu isdigit() i kullanınca baktım ki - sayılarda işe yaramıyor onu çözmeye çalışayım dedim sonra da fark ettiğiniz gibi çorba oldu. Bu kod için konuşacak olursam şu 17. Satırı lenght+1 yerine lenght e çevirirsem girsiğimiz sayının son karakterini görmezden gelmiş olmaz mıyız. Range adlı eleman o son sınırı dahil etmiyor diye sonuncuyu da dahil etmek için lenght + 1 demiştim aslında.
 
Yanıtın için teşekkür ederim, başka yöntemlere baktığımda dediğiniz gibi int(girdi) yapıp onun kontrolünü sağlasaymışım daha basit olurmuş. Hoca şu isdigit() i kullanınca baktım ki - sayılarda işe yaramıyor onu çözmeye çalışayım dedim sonra da fark ettiğiniz gibi çorba oldu. Bu kod için konuşacak olursam şu 17. Satırı lenght+1 yerine lenght e çevirirsem girsiğimiz sayının son karakterini görmezden gelmiş olmaz mıyız. Range adlı eleman o son sınırı dahil etmiyor diye sonuncuyu da dahil etmek için lenght + 1 demiştim aslında.
5 harfli bir karakterin length'ini alırsan sana 5 sayısını verir. 5 sayısını range içerisine koyarsan 4 e kadar devam eder 5 te çalışmaz. 5 harfli bir kelimenin son index'i ise 4 tür. O yüzden +1 yapmana gerek yok.
 
5 harfli bir karakterin length'ini alırsan sana 5 sayısını verir. 5 sayısını range içerisine koyarsan 4 e kadar devam eder 5 te çalışmaz. 5 harfli bir kelimenin son index'i ise 4 tür. O yüzden +1 yapmana gerek yok.
Haklısınız index ne falan diyordum da bu karakterlerin sırasıymış hem biliyor hem de bilmiyormuşum kusura bakmayın :D
 

Geri
Yukarı