folder Tahribat.com Forumları
linefolder Java
linefolder Asal Sayı Algoritması



Asal Sayı Algoritması

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RDxMaster
    RDxMaster's avatar
    Kayıt Tarihi: 15/Eylül/2007
    Erkek

    Dostlar Kod Bu :

     

              System.out.println("Bir Sayı Giriniz");
             
               Scanner girdi = new Scanner(System.in);// Bu mühim değil girdi almak için

               int sayi = girdi.nextInt(); // Bu mühim değil girdi almak için sayi degiskenine klavyeden giriş
               int sayac = 2;

               if (sayi>=2)
               {
                   while(sayi/2 >= sayac)
                   {
                        if(sayi%sayac==0)
                        {
                            System.out.println("Sayimiz "+ sayac + " ile tam bölünmektedir.");
                            break;
                        }
                        else if(sayi%sayac!=0 && sayi>sayac*2)
                        {
                            sayac++;
                        }
                        if(sayi/2 == sayac)
                        {
                            System.out.println("sayimiz Asaldır");
                        }
                   }
               }
               else
               {
                   System.out.println("Sayınız >= 2 olmalıdır");
               }

    Daha Kısa bi formülü varmıdır . Zorla bunu çıkarabildim.

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Sscheme
    Sscheme's avatar
    Kayıt Tarihi: 04/Mart/2007
    Erkek

    http://en.wikipedia.org/wiki/Trial_division

     

     


    Bütün mesajlarım ve konularım BSD Lisansı"yla lisanslanmıştır.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    int i=2,bolen=0,sayi;
    System.out.println("Bir Sayı Giriniz"); Scanner girdi = new Scanner(System.in); int sayi = girdi.nextInt(); if(sayi>=2) { while(i==n/2) { if(sayi%i==0) { bolen++; } i++; } if(bolen==0) { System.out.println("sayı asal"); } else { System.out.println("sayı asal değil"); } } else { System.out.println("Sayınız >= 2 olmalıdır"); }
    şu hale getirdim ama kısa oldumu olmadımı anlamadım :D bi dene istersen

    bide şu şekildede yapabilirsin. ***Kodlarda hata yaptım sanırım ama anlarsın demek istediğimi :)

    int i=2,bolen=0,sayi;
    System.out.println("Bir Sayı Giriniz");
    Scanner girdi = new Scanner(System.in);
    int sayi = girdi.nextInt();
    if(sayi>=2)
    {
    while(i==n/2)
    {
    if(sayi%i==0)
    {
    bolen++;
    if(bolen!=0)
    {
    System.out.println("sayı asal değil");
    break;
    }
    }
    i++;
    }
    System.out.println("sayı asal");
    }
    else
    {
    System.out.println("Sayınız >= 2 olmalıdır");
    }
    if bloklarını && ile birleştirmeye çalış şu an kafam çok fena karıştı düzenleyemiyorum

    :)
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RDxMaster
    RDxMaster's avatar
    Kayıt Tarihi: 15/Eylül/2007
    Erkek

    valla ustam 1 saat yapmak için uğraştım 1 saatte düzeltmek için mal gibi hissettim kendimi :D

    senin söylediğini anladım şöyle birşey var . kitapta buldum :D

    ---------------------------------------

               int sayi , sayac = 2 ;
               boolean test = true;
               
               System.out.println("Bir Sayı Gir:");
               Scanner girdi = new Scanner(System.in);
               sayi = girdi.nextInt();
              
               while (test && sayac<= (int)Math.sqrt(sayi))
               {
                   if(sayi%sayac==0)
                   {
                       test = 1 == 3; // Burada 1 == 3 yi boolean olan test değişkenine atıyor .yani test = false ;
                   }
                   else
                   {
                   sayac++;   
                   }
                        if(test)                   
                            System.out.println(sayi +" Asaldır");                
                        else 
                            System.out.println(sayi + " Asal Değildir");
                        }

    -----------------------------------------

    Sanırım Burada daha az kod var. :) Yardımın için çok teşekkür ederim. Değişken isimlerini farklı tanımlayıp farklı kullanmışsın sorun orda .

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    camarade
    ontedi
    ontedi's avatar
    Kayıt Tarihi: 04/Eylül/2005
    Erkek

    Asal sayı için şuan en iyi yöntem sayıyı kareköke kadar bölmektir.

     

    Mesela 100 sayısı asal olduğunu varsayalım. 100'ü tek tek 2, 3, 5, 7, 11... sayılarına bölmektense 100'ün karekökü = 10'a kadar bölmek daha kısa ve kolaydır. Kareköküne kadar bir sayı bölmüşse kendisini hayli hayli böler. 


    Matematikçi ve Yazılımcı. http://www.ontedi.com ve http://www.cizgi.site Siteme beklerim herkesi.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ontedi bunu yazdı:
    -----------------------------

    Asal sayı için şuan en iyi yöntem sayıyı kareköke kadar bölmektir.

     

    Mesela 100 sayısı asal olduğunu varsayalım. 100'ü tek tek 2, 3, 5, 7, 11... sayılarına bölmektense 100'ün karekökü = 10'a kadar bölmek daha kısa ve kolaydır. Kareköküne kadar bir sayı bölmüşse kendisini hayli hayli böler. 


    -----------------------------

    hayır asal sayı tespiti için asal sayılara bölünebilmeyi değil sayının 1den büyük tamsayılardan hiçbirine bölünüp bölünmediği kontrol edilir(kendisi hariç) onun içinde sayının yarısına kadar olanları kontrol etmek yeter :)

     

    EDİT:

    int i=2,bolen=0,sayi;
    System.out.println("Bir Sayı Giriniz");
    Scanner girdi = new Scanner(System.in);
    int sayi = girdi.nextInt();
    if(sayi>=2)
    {
    if(sayi%2==0 || sayi%3==0 || sayi%5==0 || sayi%7==0 || sayi%11==0 || sayi%13==0 || sayi%17==0 || sayi%19==0)
    {
    System.out.println("sayı asal değil");
    }
    else
    {
    System.out.println("sayı asal");
    }
    }
    else
    {
    System.out.println("sayı 2den büyük olmalı");
    }

     

     edit :D bu kod olmadı,bölünebilme kurallarına bak vikipediden bu şekilde yap. olmamasının sebebi şu; mesela girilen sayı 7,7 asal sayı ama 7ye bölünebildiği için asal sayı değil diyecek program,ama en kısa yolu bu şekilde,bunu hatırladım,derste yapmıştık.


    :)
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    JPriest
    JPriest's avatar
    Kayıt Tarihi: 09/Mart/2007
    Erkek
           boolean asalMi(int sayi) {
    		for (int i = 2; i <= Math.sqrt(sayi); i++) {
    			if (sayi % i == 0) return false;
    		}
    		return true;
    	}

    Sen hiç kaval çaldın mı?
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    camarade
    ontedi
    ontedi's avatar
    Kayıt Tarihi: 04/Eylül/2005
    Erkek

    @wasd

    Dostum sayının kareköküne kadar olan sayılara bölmek daha hızlıdır. Ayrıca artırım miktarı 2 olmalıdır

    Mesela

    for i = 3 to sqr(sayi)

    bolum = sayi / i

    response.write bolum 

    i = i + 2 

    next


    Matematikçi ve Yazılımcı. http://www.ontedi.com ve http://www.cizgi.site Siteme beklerim herkesi.
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ontedi bunu yazdı:
    -----------------------------

    @wasd

    Dostum sayının kareköküne kadar olan sayılara bölmek daha hızlıdır. Ayrıca artırım miktarı 2 olmalıdır

    Mesela

    for i = 3 to sqr(sayi)

    bolum = sayi / i

    response.write bolum 

    i = i + 2 

    next


    -----------------------------

    tamam ufak sayılar için dediğin mantık doğru :) ama 1000001 asalmı değilmi denildiğinde sayı çiftlik kontrolünden geçer,karekökü 1000 olur ve 500civarı bölme yaparsın 2şer arttırarak,benim dediğimde 5-10 bölme işlemiyle biter. kod çok fazla kısaltılırsa performansta satır sayısıyla birlikte azalır.


    :)
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Excel
    radres
    radres's avatar
    Kayıt Tarihi: 28/Şubat/2009
    Erkek

    edit : saçmaladım :D ...


    valar morghulis ...
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RDxMaster
    RDxMaster's avatar
    Kayıt Tarihi: 15/Eylül/2007
    Erkek

    Birde olaya şöyle yaklaşalım. Şimdi int ve longun (tamsayılar long uzun int kısa) belli bir tanım aralığı var değilmi.? int için int değerinin maximumunu alıp onun karekökünü buldursak ve bu karekökten önceki bütün asal sayıları tarayıp bir diziye atayıp o diziyle girilen sayının kontrolünü yapsak .? Bu dediğim çok uzun bir işlem ama bence performans açısından en optimize yol bu olur. Mesela bir class tanımlarsın bu yöntemlerle elde ettiğin diziyi yani bir kütüphane gibi. daha sonra bir sayının asal olup olmadığını class a denetletirsin olay biter.ha bir classın çağrılması bir döngüyü döndermekten daha hızlı işleyen bir olaymıdır onuda bu konuda daha bilgili olanlar söylesin.(class ı dizilerle oluşturmamıza falan gerek yok o sayıları japonlar bulmuştur zaten  :D maksat herşeyi bi programlamayla yapmak için)

Toplam Hit: 5489 Toplam Mesaj: 14