Asal Sayı Algoritması
-
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.
-
-
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 -
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 .
-
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.
-
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.
-
boolean asalMi(int sayi) { for (int i = 2; i <= Math.sqrt(sayi); i++) { if (sayi % i == 0) return false; } return true; } -
@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
-
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.
-
edit : saçmaladım :D ...
-
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)
