Şimdi Ara

C Asal Sayı Bulma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
19
Cevap
0
Favori
1.731
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Yapmak istediğim şey asal sayıları bulmak.Sadece tek sayıları inceleyerek yapmak istiyorum.Bir kere kodlar ile oynarken bunu yaptım asal sayıları yazdırdı ama sıkıntı şurdaki ikinci for döngüsünün içine yazmıştım bu yüzden 97 defa 97 yazmıştı.Düşüncem mi yanlış,yani böyle bir şey olmaz mı?Yoksa kodlarda mı bir sıkıntı var?Ayrıca aktif olarak Türkçe yazılım forumu önerir misiniz?
    Ayrıca break komutu tam olarak nedir?Yani mesela iç içe for döngüsü yazdık,içteki for döngüsüne bir şart koyduk ve bu şart olursa break; yazdık.Şimdi iki for döngüsünden de bir daha dönmemek üzere mi çıkıyor yoksa içteki for döngüsünden çıkıp bir daha ikinci for döngüsüne mi giriyor?
    Ayrıca for döngüsünün içine while(i%2!=0) yazdım.İlk başta if denedim sadece tek sayıları yazdırıyor ama while deyince program hiçbir şekilde çıktı vermiyor.
    onlinegdb.com
    Just a moment...
    https://onlinegdb.com/SkON-8SJE



    < Bu mesaj bu kişi tarafından değiştirildi arkasokaklar12634 -- 5 Aralık 2018; 16:46:39 >







  • 1-C++'da asal sayiları bulan programı şu şekilde yazdım. kendi isteğin üzerine modifiye edebilirsin.

     
    #include <iostream>

    using namespace std;

    int main()
    {

    int asalSayi;
    bool asal = true;
    for (asalSayi = 2; asalSayi < 100; asalSayi++)
    {
    for (int i = 2; i < asalSayi; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;

    }
    system("pause");

    }


    2-Break komutu içinde bulunduğu döngü parçasını kırar.

    Sorularını biraz daha düzenli yazarsan insanlar daha iyi yardımcı olabilir. sorudan soruya atlaman işini zorlaştırır.
  • Cevap:https://paste.ubuntu.com/p/bQFwJJ5qZT/

    Öncelikle orada while döngüsüne gerek yok. Bir diğer sorunun asal mı değil mi kontrolünü yapmaman. Yazdığım kodlara bak ne demek istediğimi anlarsın.

    Yazılım forumu olarak en aktifi donanımhaber sanırım. Daha iyisi varsa mesaj yoluyla iletebilirsiniz.
  • ikinci for döngüsünde i < asalSayi / 2 de yazabilirsin cunku yarısına kadar asal = false veriyorsa 2 katı da kesinlikle false verecektir bu da işlemi 2x hızlandırır; algoritmalarda hız önemlidir.

    ilk for döngüsünde ise asalSayi=1 'den başlamak matematik açısından daha doğru olur cunku 1 bir asal sayıdır :)
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    ikinci for döngüsünde i < asalSayi / 2 de yazabilirsin cunku yarısına kadar asal = false veriyorsa 2 katı da kesinlikle false verecektir bu da işlemi 2x hızlandırır; algoritmalarda hız önemlidir.

    ilk for döngüsünde ise asalSayi=1 'den başlamak matematik açısından daha doğru olur cunku 1 bir asal sayıdır :)
    teşekkürler siz böyle dedikten sonra aklıma işlemi 2xden de fazla hızlandıracak bir fikir geldi. ilk 10 sayıyı kendinden küçük tüm sayılarla, 10 dan büyük sayılar içinse sadece 2-9 arası rakamlarla bölünüp bölünmediğini kontrol etmek programı çok daha fazla hızlandıracaktır (ilk 100 sayının içindeki asalları bulmak için geçerli). o yüzden kodumu şu şekilde düzenledim. yüksek oranda hız artışı olduğuna inanıyorum.

    bu arada hocam en küçük asal sayı 2'dir. 1 asal sayı değil bir yanlışlık oldu herhalde.

     
    #include <iostream>

    using namespace std;

    int main()
    {

    int asalSayi;
    bool asal = true;
    for (asalSayi = 2; asalSayi < 100; asalSayi++)
    {
    if (asalSayi < 9) {
    for (int i = 2; i < asalSayi; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }
    else {
    for (int i = 2; i < 10; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }

    }
    system("pause");

    }





  • Evet 100'e kada sayı için o da makul çözüm. Bu arada benim iterasyonda 4 asal sayı olarak çıkıyor, kodu deneyince fark ettim fakat sadece 4.
    if (asal == true && asalSayi != 4) yapınca düzeliyor ama o zamanda kod uzamış oluyor.

    Evet 1 asal sayı değil; onu Fibonacci sayıları ile karıştırdım :)
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    Evet 100'e kada sayı için o da makul çözüm. Bu arada benim iterasyonda 4 asal sayı olarak çıkıyor, kodu deneyince fark ettim fakat sadece 4.
    if (asal == true && asalSayi != 4) yapınca düzeliyor ama o zamanda kod uzamış oluyor.

    Evet 1 asal sayı değil; onu Fibonacci sayıları ile karıştırdım :)
    Şu şekilde programa istenilen sayının kökünü sınır olarak verince daha güzel oldu. örnek olarak 144'e kadar olan asalları istediğimizde 1-12 arası sayılarla bölmeye çalışması daha mantıklı. böylelikle istenilen her hangi bir sayı için asal sayı sıralanabilir.

     
    #include <iostream>
    #include <cmath>

    using namespace std;

    int main()
    {
    int asalSayiBoyut;
    cout << "Hangi sayiya kadar olan asal sayilar hesaplansin :";
    cin >> asalSayiBoyut;
    int asalSayiKok = sqrt(asalSayiBoyut);
    int asalSayi;
    bool asal = true;
    for (asalSayi = 2; asalSayi < asalSayiBoyut; asalSayi++)
    {
    if (asalSayi < asalSayiKok) {
    for (int i = 2; i < asalSayi; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }
    else {
    for (int i = 2; i < asalSayiKok; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }

    }
    system("pause");

    }




  • Hocam bildiğiniz gibi en küçük asal sayı 2 dir ve 2 den başka çift asal sayı yoktur.Bu yüzden 2 den sonraki çift sayıları incelemeye gerek yok bence bu yüzden while(i%2!=0) koydum yani i nin 4 6 8 gibi sayıları almasını istemiyorum doğru olur mu,yani algoritma doğru ve hızlı çalışır mı?
    Ayrıca şimdi aklıma geldi 3 ten itibaren 2 şer 2şer arttırılabiliniyormuş



    < Bu mesaj bu kişi tarafından değiştirildi arkasokaklar12634 -- 6 Aralık 2018; 14:39:27 >
  • arkasokaklar12634 A kullanıcısına yanıt
    Hm o detayda bir yorum yapamam cunku algoritma sonuçta biraz tasarım işi; yani istediğin şekilde, isteğin yöntem ile tasarlayabilirsin. Örneğin BMW sıralı 6 silindir motor tasarladı, Porsche yatay 6 silindir ile Boxer motor tasarladı, ayrı tasarımlar ancak ikisi de iyi performans veriyor, onun gibi :
  • def init kullanıcısına yanıt
    Bir de bu asal sayıları yazdırmak için neden kontrol etmek gerekli.Yani mesela asal==1 yapmamız neden gerekiyor?Benim yaptığım gibi şartı sağlarsa yazdırsın neden olmuyor ?
  • #include <stdio.h>
    #include <math.h>

    int checkPrimeNumber(int n);
    int checkArmstrongNumber(int n);

    int main()
    {
    int n, flag;

    printf("Enter a positive integer: ");
    scanf("%d", &n);

    // Check prime number
    flag = checkPrimeNumber(n);
    if (flag == 1)
    printf("%d is a prime number.
    ", n);
    else
    printf("%d is not a prime number.
    ", n);

    // Check Armstrong number
    flag = checkArmstrongNumber(n);
    if (flag == 1)
    printf("%d is an Armstrong number.", n);
    else
    printf("%d is not an Armstrong number.",n);
    return 0;
    }

    int checkPrimeNumber(int n)
    {
    int i, flag = 1;

    for(i=2; i<=n/2; ++i)
    {

    // condition for non-prime number
    if(n%i == 0)
    {
    flag = 0;
    break;
    }
    }
    return flag;
    }

    int checkArmstrongNumber(int number)
    {
    int originalNumber, remainder, result = 0, n = 0, flag;

    originalNumber = number;

    while (originalNumber != 0)
    {
    originalNumber /= 10;
    ++n;
    }

    originalNumber = number;

    while (originalNumber != 0)
    {
    remainder = originalNumber%10;
    result += pow(remainder, n);
    originalNumber /= 10;
    }

    // condition for Armstrong number
    if(result == number)
    flag = 1;
    else
    flag = 0;

    return flag;
    }


    bu kodda Armstrong ve Asal sayıları hesaplıyor.

    Bu koda bakıp kendi oluşturduğun kod ile karşılaştırabilirsin.
    Armstrong sayı nedir:
    matkafasi.com
    Armstrong sayı - Matematik Kafası
    http://matkafasi.com/42198/armstrong-sayi


    çok örnek var bu konu hakkında



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 8 Aralık 2018; 9:30:47 >




  • quote:

    Orijinalden alıntı: Guest-DA02D78F4

    Şu şekilde programa istenilen sayının kökünü sınır olarak verince daha güzel oldu. örnek olarak 144'e kadar olan asalları istediğimizde 1-12 arası sayılarla bölmeye çalışması daha mantıklı. böylelikle istenilen her hangi bir sayı için asal sayı sıralanabilir.

     
    #include <iostream>
    #include <cmath>

    using namespace std;

    int main()
    {
    int asalSayiBoyut;
    cout << "Hangi sayiya kadar olan asal sayilar hesaplansin :";
    cin >> asalSayiBoyut;
    int asalSayiKok = sqrt(asalSayiBoyut);
    int asalSayi;
    bool asal = true;
    for (asalSayi = 2; asalSayi < asalSayiBoyut; asalSayi++)
    {
    if (asalSayi < asalSayiKok) {
    for (int i = 2; i < asalSayi; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }
    else {
    for (int i = 2; i < asalSayiKok; i++)
    {
    if (asalSayi % i == 0)
    asal = false;
    }
    if (asal == true)
    cout << asalSayi << endl;
    asal = true;
    }

    }
    system("pause");

    }


    Alıntıları Göster
    Senin kodda bir hata var 10 sayısını girdiğimde doğru çalıştı 2'de hiç bir şey yok. 9 kadar rakamları sıralıyor. 10 sayısında doğru olarak çalıştı
    C Asal Sayı Bulma



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 8 Aralık 2018; 9:54:2 >




  • berce B kullanıcısına yanıt
    Armstrong sayısını hesaplamak algoritma uygulaması açısından -bence- önemli değil cunku sadece bir for veya while döngüsü ile halledilebilen birşey. Sayıyı basamaklara %10 kullanarak ayırmak ta yeni birşey değil.

    Alttaki soruda 2 'yi asal sayı olarak bulmaması da döngünün başlangıç değeriyle ilgili bir ayrıntı sadece.
  • bakmadım başka örneklerde vardır elbet. Zaten belli oranda birbirlerine benzerler bunlar.
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    ikinci for döngüsünde i < asalSayi / 2 de yazabilirsin cunku yarısına kadar asal = false veriyorsa 2 katı da kesinlikle false verecektir bu da işlemi 2x hızlandırır; algoritmalarda hız önemlidir.

    ilk for döngüsünde ise asalSayi=1 'den başlamak matematik açısından daha doğru olur cunku 1 bir asal sayıdır :)
    Onden asalSayi % 2 == 0 mi diye bakip (ve 2 olmamasi lazim tabi ki) 0 ise dogrudan false dondurulebilir. Bunu yaptiktan sonra return etmediyse 3 ten asalSayi'ya kadar ikiser ikiser atlayarak gidilebilir. Boylece average costu O(n/4) olur tek sayilarin bulunmasi.



    Bu dedigim cok kucuk sayilarda nasil calisir bilmiyorum, duruma gore 1-2 tane edge case'i ozel tanimlamak gerekebilir, ama zannetmiyorum.
  • Bir yerde şöyle bir şey okumuştum daha hızlıymış gibi ama tam fikrim yok





    Eleme yoluyla asalları buluyorsun



    2 3 4 5 6 7 .... 35 36........ 190........2749

    Gibi bir liste array dizin vb var



    Şimdi baştan başlıyorsun

    2 sağdaki 2nin katı olanları olmaz diye işaretliyorsun

    Sonra 3 e geçtin 3 ün katlarını işaretliyorsun

    4 e gelmiyorsun çünkü bu işaretliydi

    5 geçtin 5inkatlaeını işaretliyorsun

    ... böyle böyle en büyüğün kökünün olduğu yere kadar gidince oluşturduğun dizideki işaretsizler asal sayıların oluyor



    Hatırladığım kadarıyla bu daha verimli oluyormuş, ama emin değilim hesap kitap yapmadım



    Dynamic programming diye okumuştum galiba
  • quote:

    Orijinalden alıntı: berce

    Senin kodda bir hata var 10 sayısını girdiğimde doğru çalıştı 2'de hiç bir şey yok. 9 kadar rakamları sıralıyor. 10 sayısında doğru olarak çalıştı
    C Asal Sayı Bulma
    haklısın hocam şimdi ben de kodumu inceledim de o istisnalara göz atmamışım. 2 ye özel bir istisna var tek çift asal sayı olduğu için. benim kodumda denemeye 3 den başlıyor bu yüzden 2 girdiğinde 2yi es geçiyor orada eşittir koysan bile 2mod2=0 vereceği için bu sefer asal değil kabul edecek bu sadece 2 ye ait bir istisna gözümden kaçmış yazarken.




  • quote:

    Orijinalden alıntı: Guest-DA02D78F4

    haklısın hocam şimdi ben de kodumu inceledim de o istisnalara göz atmamışım. 2 ye özel bir istisna var tek çift asal sayı olduğu için. benim kodumda denemeye 3 den başlıyor bu yüzden 2 girdiğinde 2yi es geçiyor orada eşittir koysan bile 2mod2=0 vereceği için bu sefer asal değil kabul edecek bu sadece 2 ye ait bir istisna gözümden kaçmış yazarken.

    Alıntıları Göster
    for içersinde ki statement <= yaptığında 2 alıyor lakin sonraki kodlar bozuluyor. yeniden düzenlemek gerekiyor.
    @Wepawet



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 12 Aralık 2018; 19:40:28 >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.