Break İfadesini Kullanmadan Döngü Kullanımı - 1 ila n Sayısı Arasındaki Asal Sayı Tespiti

ZuL-RaA

Kadim Üye
9 Ara 2017
5,552
839
Semerkant
Merhabalar,

1 ve kendisinden başka böleni olmayan sayılara asal sayı deniyor malum.

Sorulan bir soru üzerinde sadece, koşullu ifadeler ve döngüler ile - tanımlamalar vs. serbest- "break" ifadesi kullanmadan 1 ile n sayısı - n dahil- arasındaki asal sayıları bulabilen bir program yazmamız gerekti.

25 dakikalık bir düşünme sonucunda olumsuz olduğuna - yapılamayacağına - karar vermiştim. Soruya farklı birinin yorumu üzerine kontrol noktası / bayrak sistemi kısaca 0 ve 1 ile doğrulanıp yapılacağına vardım. Bir sürelik kodlamadan sonra halledildi.

Soru sizlere de açık:

n sayısı alın.
1 ile n arasındaki asal sayıları, "break" ifadesiz koşullu ifadelerle ve döngü kullanarak tespit edin.


gBPwFuWw_o.png


Niye bu kadar zorlandım anlam veremezken düşünmeden koda gitme ihtiyacı insanın aklına geliyor. Evet, biraz düşünülüp yapılması gerek.

Asal sayıları bulmak konusunda kullanılabilecek bizler için özellikle asal sayı büyüdüğünde deneme yanılma oluyor. Bilgisayarda olduğumuzdan ötürü sayının kendisinden küçük sayılara bölünüp bölünmediğine bakarak tespit edebiliriz.
1 ile n arasındaki sayılar istendiğinden ötürü - 1 hariç, n dahil - sırayla bu sarıları tek tek alıp, onlardan önceki sayılara bölmek mantıklı geliyor.
n = 10 bin olacağını sarsayalım ve anlık olarak asal olup olmadığını kontrol ettiğimiz sayı 8649 olsun. (93 'ün karesidir ve 93 asal.)
Düz mantık olarak 1 den 93 e kadar bölmüyorsa if else de "mod" aldığımızda kalan 0'a eşit değildir. 0 a eşit olmadığı için buraya kadar gelebildik. 93 ile bölümü 0'a eşit geliyor. Bu sayı için bölündüğünde ekrana asal değil yazdırmak işimizi görse de birden çok asalın çarpımından oluşan bir sayıda mesela 60, her bölene geldiğinde 60 için asal değildir yazacak. Hatta asal olmayanların sayısı daha fazla olduğu için biz asalları yazdırmalıyız. "break" ifadesi olsa onu ilk bölen sayıda döngüden çıkar ve 8649 kabul ettiğimiz sayısı bir arttırıp yolumuza devam ederdik. Ancak edemiyoruz. Kontrol'de sıkıntı çıkmakta.

Bir sürelik düşünceden sonra xx isimli bir değişken oluşturup her yeni n'e doğru giden sayımızda o değişkeni 0 başlatıp eğer bölünürse 1 olarak güncelleyip en sonunda ikinci kontrol mekanizması sayımıza eşit olunca değeri 1 mi 0 mı diye kontrol etmek artık benim için çözüm oluyor. Kodlaması da kafa karıştırıcı oldu. Akış diyagramını vermeyeceğim. Siz oluşturabilirsiniz...

gBPwFuWw_o.png


C Kodu

C:
#include <stdio.h>

int main() {
    int n, durum;

    do {
        printf("1 ile hangi sayi arasindaki asallari bulmak istiyorsunuz: ");
        scanf("%d",&n);

        if(n > 100000)
            printf("Daha kucuk bir sayi secin!\n");
    } while (n > 100000);


    durum = 0;

    for(int i = 2; i != n + 1 ; i++) {

        for(int y = 2 ; y != i; y++) {

            if(i%y == 0 && i != y)
                durum = 1;

        }

        if (durum == 1)
            durum = 0;
        else
            printf("%d asal. \n", i);

    }


    return 0;
}

Kodu C de yazmıştım. Hızını da görmüş oluruz hem. Python ile de yazılmışı göstereceğim. Onda girdi alırken "break" kullanıyorum sadece. Onu kendim ekledim.


gBPwFuWw_o.png

Python Kodu

Python:
# 100 milyon ile 1 arasındaki asal sayıların tespiti için kullanılabilir.

while True:
    n = int(input("1 ile hangi sayının arasındaki asal sayıları bulmak istersiniz?: "))
    if n > 100000001:
        print("Geçersiz değer. Daha küçük sayı giriniz.")
    else:
        break

durum = 0
dene = 2
a = 0

for i in range(2,n+1):
    while i != dene:
        if i % dene == 0:
            durum = 1
        dene += 1

    dene = 2

    if durum == 0:
        print(f"{i}, ", end='')
        a += 1

    durum = 0

    if a % 25 == 0:
        print(end="\n")

print("sayıları asaldır.")

Python kodunun çalışması PyCharm ortamında 4.5 saniye kadar sürdü. Manuel tuttum bir kod ile hesaplamadım. CLion da C kodunu çalıştırmam 1 saniyeden biraz uzun sürdü. Bilgisayardan telefona kafamı çevirdiğimde henüz 2 değildi. :)

Kodları biraz incelediğinizde 2 döngü ile yapıldığını görüyorsunuz. "do" döngüsü "while True" ifadesi olarak geçiyor programlarda genellikle ancak çalışmasına biraz müdahale etmekte gerekiyor. Seçilen birinci sayı kısmı kolay zaten, onu bölen sayıları yazarken belki de okunaklı yazmadığımdan ötürü kafam biraz karışmıştı. İlkte her sayı bire bölündüğü için asal çıkmazken, daha sonra da bayrağımızı değiştirmeyi unuttum sayılır. Konuyu okurken sorunun kolay olduğunu düşünsekte iş çalışmaya geldiğimizde biraz daha zorlu olmuştu. Düşünürken kalem kağıt kullanmak çok daha yararlı olabilir diye düşünüyorum. Uzun sürediir bakılıyorsa da biraz mola iyi gelecektir.

gBPwFuWw_o.png


Kodlarda biraz farklılık var o kadarda olur. :)
Flowgorithm uygulaması ile yapmış olsaydık direkt Python ve C# çıktısı alabilirdik. Ona sizler bakabilirsiniz. C çıktısı olmadığından yazmak gerekirdi.

Algoritma yazmak konusunda gelişmek önemlidir arkadaşlar. Project Euler sitesine bakabilirsiniz. Okuduğunuz için teşekkür ederim.

Github - C (11): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-C
Github - Python (3.7): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-Py


800px-TürkHackTeam_Logo.png
 

ACE Veen

Uzman üye
4 Şub 2023
1,097
551
Belirsiz
Merhabalar,

1 ve kendisinden başka böleni olmayan sayılara asal sayı deniyor malum.

Sorulan bir soru üzerinde sadece, koşullu ifadeler ve döngüler ile - tanımlamalar vs. serbest- "break" ifadesi kullanmadan 1 ile n sayısı - n dahil- arasındaki asal sayıları bulabilen bir program yazmamız gerekti.

25 dakikalık bir düşünme sonucunda olumsuz olduğuna - yapılamayacağına - karar vermiştim. Soruya farklı birinin yorumu üzerine kontrol noktası / bayrak sistemi kısaca 0 ve 1 ile doğrulanıp yapılacağına vardım. Bir sürelik kodlamadan sonra halledildi.

Soru sizlere de açık:

n sayısı alın.
1 ile n arasındaki asal sayıları, "break" ifadesiz koşullu ifadelerle ve döngü kullanarak tespit edin.


gBPwFuWw_o.png



Niye bu kadar zorlandım anlam veremezken düşünmeden koda gitme ihtiyacı insanın aklına geliyor. Evet, biraz düşünülüp yapılması gerek.

Asal sayıları bulmak konusunda kullanılabilecek bizler için özellikle asal sayı büyüdüğünde deneme yanılma oluyor. Bilgisayarda olduğumuzdan ötürü sayının kendisinden küçük sayılara bölünüp bölünmediğine bakarak tespit edebiliriz.
1 ile n arasındaki sayılar istendiğinden ötürü - 1 hariç, n dahil - sırayla bu sarıları tek tek alıp, onlardan önceki sayılara bölmek mantıklı geliyor.
n = 10 bin olacağını sarsayalım ve anlık olarak asal olup olmadığını kontrol ettiğimiz sayı 8649 olsun. (93 'ün karesidir ve 93 asal.)
Düz mantık olarak 1 den 93 e kadar bölmüyorsa if else de "mod" aldığımızda kalan 0'a eşit değildir. 0 a eşit olmadığı için buraya kadar gelebildik. 93 ile bölümü 0'a eşit geliyor. Bu sayı için bölündüğünde ekrana asal değil yazdırmak işimizi görse de birden çok asalın çarpımından oluşan bir sayıda mesela 60, her bölene geldiğinde 60 için asal değildir yazacak. Hatta asal olmayanların sayısı daha fazla olduğu için biz asalları yazdırmalıyız. "break" ifadesi olsa onu ilk bölen sayıda döngüden çıkar ve 8649 kabul ettiğimiz sayısı bir arttırıp yolumuza devam ederdik. Ancak edemiyoruz. Kontrol'de sıkıntı çıkmakta.

Bir sürelik düşünceden sonra xx isimli bir değişken oluşturup her yeni n'e doğru giden sayımızda o değişkeni 0 başlatıp eğer bölünürse 1 olarak güncelleyip en sonunda ikinci kontrol mekanizması sayımıza eşit olunca değeri 1 mi 0 mı diye kontrol etmek artık benim için çözüm oluyor. Kodlaması da kafa karıştırıcı oldu. Akış diyagramını vermeyeceğim. Siz oluşturabilirsiniz...

gBPwFuWw_o.png


C Kodu

C:
#include <stdio.h>

int main() {
    int n, durum;

    do {
        printf("1 ile hangi sayi arasindaki asallari bulmak istiyorsunuz: ");
        scanf("%d",&n);

        if(n > 100000)
            printf("Daha kucuk bir sayi secin!\n");
    } while (n > 100000);


    durum = 0;

    for(int i = 2; i != n + 1 ; i++) {

        for(int y = 2 ; y != i; y++) {

            if(i%y == 0 && i != y)
                durum = 1;

        }

        if (durum == 1)
            durum = 0;
        else
            printf("%d asal. \n", i);

    }


    return 0;
}

Kodu C de yazmıştım. Hızını da görmüş oluruz hem. Python ile de yazılmışı göstereceğim. Onda girdi alırken "break" kullanıyorum sadece. Onu kendim ekledim.


gBPwFuWw_o.png


Python Kodu

Python:
# 100 milyon ile 1 arasındaki asal sayıların tespiti için kullanılabilir.

while True:
    n = int(input("1 ile hangi sayının arasındaki asal sayıları bulmak istersiniz?: "))
    if n > 100000001:
        print("Geçersiz değer. Daha küçük sayı giriniz.")
    else:
        break

durum = 0
dene = 2
a = 0

for i in range(2,n+1):
    while i != dene:
        if i % dene == 0:
            durum = 1
        dene += 1

    dene = 2

    if durum == 0:
        print(f"{i}, ", end='')
        a += 1

    durum = 0

    if a % 25 == 0:
        print(end="\n")

print("sayıları asaldır.")

Python kodunun çalışması PyCharm ortamında 4.5 saniye kadar sürdü. Manuel tuttum bir kod ile hesaplamadım. CLion da C kodunu çalıştırmam 1 saniyeden biraz uzun sürdü. Bilgisayardan telefona kafamı çevirdiğimde henüz 2 değildi. :)

Kodları biraz incelediğinizde 2 döngü ile yapıldığını görüyorsunuz. "do" döngüsü "while True" ifadesi olarak geçiyor programlarda genellikle ancak çalışmasına biraz müdahale etmekte gerekiyor. Seçilen birinci sayı kısmı kolay zaten, onu bölen sayıları yazarken belki de okunaklı yazmadığımdan ötürü kafam biraz karışmıştı. İlkte her sayı bire bölündüğü için asal çıkmazken, daha sonra da bayrağımızı değiştirmeyi unuttum sayılır. Konuyu okurken sorunun kolay olduğunu düşünsekte iş çalışmaya geldiğimizde biraz daha zorlu olmuştu. Düşünürken kalem kağıt kullanmak çok daha yararlı olabilir diye düşünüyorum. Uzun sürediir bakılıyorsa da biraz mola iyi gelecektir.

gBPwFuWw_o.png


Kodlarda biraz farklılık var o kadarda olur. :)
Flowgorithm uygulaması ile yapmış olsaydık direkt Python ve C# çıktısı alabilirdik. Ona sizler bakabilirsiniz. C çıktısı olmadığından yazmak gerekirdi.

Algoritma yazmak konusunda gelişmek önemlidir arkadaşlar. Project Euler sitesine bakabilirsiniz. Okuduğunuz için teşekkür ederim.

Github - C (11): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-C
Github - Python (3.7): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-Py


800px-TürkHackTeam_Logo.png
elinize sağlık hocam güzel bir konu olmuş
 

invisible blood

Uzman üye
15 Eyl 2023
1,177
442
Merhabalar,

1 ve kendisinden başka böleni olmayan sayılara asal sayı deniyor malum.

Sorulan bir soru üzerinde sadece, koşullu ifadeler ve döngüler ile - tanımlamalar vs. serbest- "break" ifadesi kullanmadan 1 ile n sayısı - n dahil- arasındaki asal sayıları bulabilen bir program yazmamız gerekti.

25 dakikalık bir düşünme sonucunda olumsuz olduğuna - yapılamayacağına - karar vermiştim. Soruya farklı birinin yorumu üzerine kontrol noktası / bayrak sistemi kısaca 0 ve 1 ile doğrulanıp yapılacağına vardım. Bir sürelik kodlamadan sonra halledildi.

Soru sizlere de açık:

n sayısı alın.
1 ile n arasındaki asal sayıları, "break" ifadesiz koşullu ifadelerle ve döngü kullanarak tespit edin.


gBPwFuWw_o.png



Niye bu kadar zorlandım anlam veremezken düşünmeden koda gitme ihtiyacı insanın aklına geliyor. Evet, biraz düşünülüp yapılması gerek.

Asal sayıları bulmak konusunda kullanılabilecek bizler için özellikle asal sayı büyüdüğünde deneme yanılma oluyor. Bilgisayarda olduğumuzdan ötürü sayının kendisinden küçük sayılara bölünüp bölünmediğine bakarak tespit edebiliriz.
1 ile n arasındaki sayılar istendiğinden ötürü - 1 hariç, n dahil - sırayla bu sarıları tek tek alıp, onlardan önceki sayılara bölmek mantıklı geliyor.
n = 10 bin olacağını sarsayalım ve anlık olarak asal olup olmadığını kontrol ettiğimiz sayı 8649 olsun. (93 'ün karesidir ve 93 asal.)
Düz mantık olarak 1 den 93 e kadar bölmüyorsa if else de "mod" aldığımızda kalan 0'a eşit değildir. 0 a eşit olmadığı için buraya kadar gelebildik. 93 ile bölümü 0'a eşit geliyor. Bu sayı için bölündüğünde ekrana asal değil yazdırmak işimizi görse de birden çok asalın çarpımından oluşan bir sayıda mesela 60, her bölene geldiğinde 60 için asal değildir yazacak. Hatta asal olmayanların sayısı daha fazla olduğu için biz asalları yazdırmalıyız. "break" ifadesi olsa onu ilk bölen sayıda döngüden çıkar ve 8649 kabul ettiğimiz sayısı bir arttırıp yolumuza devam ederdik. Ancak edemiyoruz. Kontrol'de sıkıntı çıkmakta.

Bir sürelik düşünceden sonra xx isimli bir değişken oluşturup her yeni n'e doğru giden sayımızda o değişkeni 0 başlatıp eğer bölünürse 1 olarak güncelleyip en sonunda ikinci kontrol mekanizması sayımıza eşit olunca değeri 1 mi 0 mı diye kontrol etmek artık benim için çözüm oluyor. Kodlaması da kafa karıştırıcı oldu. Akış diyagramını vermeyeceğim. Siz oluşturabilirsiniz...

gBPwFuWw_o.png


C Kodu

C:
#include <stdio.h>

int main() {
    int n, durum;

    do {
        printf("1 ile hangi sayi arasindaki asallari bulmak istiyorsunuz: ");
        scanf("%d",&n);

        if(n > 100000)
            printf("Daha kucuk bir sayi secin!\n");
    } while (n > 100000);


    durum = 0;

    for(int i = 2; i != n + 1 ; i++) {

        for(int y = 2 ; y != i; y++) {

            if(i%y == 0 && i != y)
                durum = 1;

        }

        if (durum == 1)
            durum = 0;
        else
            printf("%d asal. \n", i);

    }


    return 0;
}

Kodu C de yazmıştım. Hızını da görmüş oluruz hem. Python ile de yazılmışı göstereceğim. Onda girdi alırken "break" kullanıyorum sadece. Onu kendim ekledim.


gBPwFuWw_o.png


Python Kodu

Python:
# 100 milyon ile 1 arasındaki asal sayıların tespiti için kullanılabilir.

while True:
    n = int(input("1 ile hangi sayının arasındaki asal sayıları bulmak istersiniz?: "))
    if n > 100000001:
        print("Geçersiz değer. Daha küçük sayı giriniz.")
    else:
        break

durum = 0
dene = 2
a = 0

for i in range(2,n+1):
    while i != dene:
        if i % dene == 0:
            durum = 1
        dene += 1

    dene = 2

    if durum == 0:
        print(f"{i}, ", end='')
        a += 1

    durum = 0

    if a % 25 == 0:
        print(end="\n")

print("sayıları asaldır.")

Python kodunun çalışması PyCharm ortamında 4.5 saniye kadar sürdü. Manuel tuttum bir kod ile hesaplamadım. CLion da C kodunu çalıştırmam 1 saniyeden biraz uzun sürdü. Bilgisayardan telefona kafamı çevirdiğimde henüz 2 değildi. :)

Kodları biraz incelediğinizde 2 döngü ile yapıldığını görüyorsunuz. "do" döngüsü "while True" ifadesi olarak geçiyor programlarda genellikle ancak çalışmasına biraz müdahale etmekte gerekiyor. Seçilen birinci sayı kısmı kolay zaten, onu bölen sayıları yazarken belki de okunaklı yazmadığımdan ötürü kafam biraz karışmıştı. İlkte her sayı bire bölündüğü için asal çıkmazken, daha sonra da bayrağımızı değiştirmeyi unuttum sayılır. Konuyu okurken sorunun kolay olduğunu düşünsekte iş çalışmaya geldiğimizde biraz daha zorlu olmuştu. Düşünürken kalem kağıt kullanmak çok daha yararlı olabilir diye düşünüyorum. Uzun sürediir bakılıyorsa da biraz mola iyi gelecektir.

gBPwFuWw_o.png


Kodlarda biraz farklılık var o kadarda olur. :)
Flowgorithm uygulaması ile yapmış olsaydık direkt Python ve C# çıktısı alabilirdik. Ona sizler bakabilirsiniz. C çıktısı olmadığından yazmak gerekirdi.

Algoritma yazmak konusunda gelişmek önemlidir arkadaşlar. Project Euler sitesine bakabilirsiniz. Okuduğunuz için teşekkür ederim.

Github - C (11): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-C
Github - Python (3.7): GitHub - Ustrif/Asal-Say-Tespit-Breaksiz-Py


800px-TürkHackTeam_Logo.png
Ellerinize sağlık hocam.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.