Java Örnekle birlikte asal sayıları kontrol eden program.

⚡ Akıllı Özet

Java Asal Sayı Kontrolü Programı, tek bir tamsayının bölünebilirliğinin nasıl test edildiğini ve asal veya bileşik olarak nasıl sınıflandırıldığını gösterir. Bu makale, matematiksel tanımı, döngü mantığını, çalıştırılabilir kodun tamamını, karekök optimizasyonunu, karmaşıklık karşılaştırmasını ve yeni başlayanların sık yaptığı hataları kapsamaktadır.

  • 🔢 Tanım Kuralı: Asal sayı, 1'den büyük ve yalnızca iki böleni olan doğal sayıdır; bu bölenler 1 ve sayının kendisidir.
  • 🔁 Döngü Mantığı: Adayı 2'den başlayarak sayının yarısına kadar olan her tam sayıya bölün ve kalanlardan herhangi birinin sıfır olup olmadığını kaydedin.
  • 🚩 Bayrak Deseni: Bir boolean değişkeni sonucu saklar ve break ifadesi, bir bölen bulunduğu anda döngüden çıkar.
  • Karekök Optimizasyonu: Sadece kareköke kadar olan bölenleri test etmek, sonucu değiştirmeden yineleme sayısını n/2'den √n'ye düşürür.
  • ⚠️ Sınır Durumlar: Sıfır, bir ve negatif değerler asla asal sayı değildir; 2 ise tek çift asal sayıdır.
  • ⏱️ Karmaşıklık Karşılaştırması: Temel döngü O(n) sürede, karekök yöntemi ise O(√n) sürede çalışır.
  • 🧪 Doğrulama Uygulaması: Tüm sınır koşullarını doğrulamak için 1, 2, 9, 17 ve 97 ile test edin.

Java Asal Sayıyı Kontrol Etme Programı

Asal Sayı Nedir?

Asal sayı, 1'den büyük ve yalnızca 1'e veya kendisine bölünebilen doğal sayıdır. Örneğin, 11 yalnızca 1'e veya kendisine bölünebilir. Diğer asal sayılar 2, 3, 5, 7, 11, 13, 17'dir ve bu dizi sonsuza kadar devam eder.

1'den büyük ve asal olmayan sayılara bileşik sayı denir, çünkü bu sayılar daha küçük çarpanlardan oluşabilir. 9 sayısı bileşik sayıdır çünkü 3'e tam bölünür; 15 sayısı da bileşik sayıdır çünkü hem 3'e hem de 5'e tam bölünür.

Not: 0 ve 1 asal sayı değildir. 2 tek çift asal sayıdır ve negatif değerler asla asal sayı olarak kabul edilmez.

Bir sayının asal olup olmadığını nasıl kontrol edersiniz? Java

Doğrulama stratejisi basit bir bölünebilirlik testidir. Aday değeri alın, sırayla her küçük tam sayıya bölün ve modül operatörünün döndürdüğü kalanı inceleyin. Kalanın sıfır olması, bir bölenin var olduğunu kanıtlar ve bu da sayıyı hemen geçersiz kılar.

Programın Mantığı:

  • Örneğin 17 sayısını 2 ile 17 arasındaki sayılara bölüp kalanı bulmamız gerekiyor. Eğer kalan 0 ise, sayı asal değildir.
  • Hiçbir sayı kendisinin yarısından fazlasına bölünemez. Yani ihtiyacımız var döngü sadece aracılığıyla numberToCheck/2Giriş değeri 17 ise, yarısı 8.5 olur ve döngü 2'den 8'e kadar olan değerler arasında tekrarlanır.
  • Eğer numberToCheck başka bir sayıya tam bölünebiliyorsa, isPrime bayrağı sıfıra ayarlanır. false ve döngüden çıkılır.

İki Java Özellikler tüm algoritmayı taşır. Modül operatörü % Bir tamsayı bölmesinin kalanını döndürür ve break Bu ifade, cevap bilindiği anda döngüyü durdurur, böylece gereksiz yinelemeler gerçekleştirilmez.

Java Bir sayının asal olup olmadığını kontrol eden program.

Aşağıdaki program, numberToCheck değişkenine 17 değerini atar ve her bölme adımını yazdırır, böylece mantığı satır satır takip edebilirsiniz. Kod düzenlenebilir olduğundan, değeri değiştirin ve ters sonucu görmek için 21 gibi bileşik bir sayı ile tekrar çalıştırın.

public class PrimenumberToCheckCheck {

 public static void main(String[] args) {
  int remainder;
  boolean isPrime=true;
  int numberToCheck=17; // Enter the number you want to check for prime

  //Loop to check whether the number is divisible by any number other than 1 and itself
  for(int i=2;i<=numberToCheck/2;i++)
  {
   //number is divided by i
            remainder=numberToCheck%i;
            System.out.println(numberToCheck+" Divided by "+ i + " gives a remainder "+remainder);

       //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
     if(remainder==0)
     {
        isPrime=false;
        break;
     }
  }
  // Check value true or false, if isPrime is true then the number is prime otherwise not prime
  if(isPrime)
     System.out.println(numberToCheck + " is a Prime number");
  else
     System.out.println(numberToCheck + " is not a Prime number");
    }
  }

Beklenen çıktı:

17 Divided by 2 gives a remainder 1
17 Divided by 3 gives a remainder 2
17 Divided by 4 gives a remainder 1
17 Divided by 5 gives a remainder 2
17 Divided by 6 gives a remainder 5
17 Divided by 7 gives a remainder 3
17 Divided by 8 gives a remainder 1
17 is a Prime number

Döngü 8'de durur çünkü tam sayı aritmetiğinde 17'nin 2'ye bölünmesi 8'e eşittir. Kalan hiçbir zaman sıfır olmadığı için, isPrime bayrağı başlangıçtaki true değerini korur ve son koşul olumlu sonucu yazdırır.

Karekök Yöntemi Kullanılarak Optimize Edilmiş Asal Sayı Kontrolü

Sayının yarısına kadar bölme işlemi doğru olsa da israftır. Eğer bir n sayısının karekökünden büyük bir böleni varsa, eşleşen eş bölen karekökünden küçük olmalıdır, dolayısıyla zaten bulunmuş olurdu. Bu nedenle √n'ye kadar kontrol etmek, çok daha az yinelemeyle aynı sonucu verir.

public class PrimeCheckOptimized {

    public static boolean isPrime(int n) {
        // 0, 1 and negative values are never prime
        if (n <= 1) {
            return false;
        }
        // 2 is the only even prime number
        if (n == 2) {
            return true;
        }
        if (n % 2 == 0) {
            return false;
        }
        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int[] samples = {1, 2, 9, 17, 97};
        for (int value : samples) {
            System.out.println(value + " is prime: " + isPrime(value));
        }
    }
}

Çıktı:

1 is prime: false
2 is prime: true
9 is prime: false
17 is prime: true
97 is prime: true

Kondisyon i * i <= n Bu yöntem, Math.sqrt'ye yapılan kayan noktalı çağrıyı önler ve 2 adımı her çift böleni atlar. 1,000,003 gibi bir değer için temel döngü yaklaşık 500,000 yineleme gerçekleştirirken, bu sürüm 500'den daha az yineleme gerçekleştirir.

Kullanıcı Tarafından Girilen Asal Sayıyı Kontrol Et

Sabit kodlanmış girdi, gösterimler için kullanışlıdır, ancak gerçek egzersizler genellikle klavye girdisi gerektirir. Scanner sınıfı, konsoldan bir tamsayı okur ve bunu aynı isPrime yöntemine iletir.

import java.util.Scanner;

public class PrimeCheckUserInput {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = sc.nextInt();

        boolean isPrime = number > 1;
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                isPrime = false;
                break;
            }
        }

        System.out.println(number + (isPrime ? " is a Prime number" : " is not a Prime number"));
        sc.close();
    }
}

Örnek Çalıştırma:

Enter a number: 29
29 is a Prime number

💡 İpucu: Bayrağı şu şekilde başlatmak: number > 1 0, 1 ve tüm negatif giriş değerlerini tek bir ifadede ele alır, bu da ayrı bir koruma koşuluna olan ihtiyacı ortadan kaldırır.

Asal Sayı Programı Yazarken Yapılan Sık Hatalar

Çoğu hatalı gönderim, ana döngüden ziyade sınır değerlerinde başarısız olur. Aşağıdaki liste, yeni başlayanlar için yazılmış kodlarda en sık görülen hataları kapsamaktadır.

  1. Döngüyü 1'den başlatıyoruz: Her tam sayı 1'e bölünebildiğinden, bayrak hemen false olarak ayarlanır ve program hiçbir sayının asal olmadığını bildirir.
  2. 1'i asal sayı olarak kabul etmek: 1 değerinin yalnızca bir böleni vardır, bu nedenle iki bölenli tanımına uymadığı için false döndürmelidir.
  3. Kesme ifadesini atlamak: Program hala doğru cevabı veriyor, ancak sonuç belli olduktan sonra da döngüye devam ediyor, bu da büyük veri kümelerinde zaman kaybına neden oluyor.
  4. kullanma i <= n Sınır olarak: Sayı her zaman kendisini böler, bu nedenle döngü n'ye ulaşmadan önce durmalıdır.
  5. İle kıyaslama = yerine ==: Tek bir eşittir işareti, bir değeri test etmek yerine atar; bu da if koşulunda derleme zamanı hatasına neden olur.

Asal Sayıyı Kontrol Etme Yöntemlerinin Karşılaştırılması

Girişin boyutuna ve tek bir değerin mi yoksa tüm bir aralığın mı test edilmesi gerektiğine uygun yöntemi seçin.

Yöntem Bölücü Aralığı Test Edildi Zaman Karmaşıklığı En Uygun
Temel döngü 2 ile n-1 O (n) Temel mantığı öğrenmek
Yarı bölüm 2'den n/2'ye O (n) Küçük girdiler, basit kod
Karekök yöntemi 2'den √n'ye O(√n) Tek büyük değerler
Eratosthenes Elekleri Önceden hesaplanmış tablo O(n log log n) Bir aralıktaki tüm asal sayıları listelemek

Tek bir değer yerine tüm bir aralığın sınıflandırılması gerektiğinde, elek yöntemi çok daha verimlidir. Bulma işlemi için yardımcı programımız asal Numbers 1 gelen 100 için Bu, söz konusu örüntüyü göstermektedir. Döngü tabanlı ilgili alıştırmalar için, aşağıdaki bölüme bakın. Fibonacci serisi Java, Java palindrom programı, Ve Bubble Sıralama algoritması JavaBayrak ve karşı hamle bildirme konusunda bilgilerini tazelemek isteyen yeni başlayanlar aşağıdaki yazıyı okumalıdır. Java değişkenler esasta Java öğretici.

SSS

Hayır. 1 sayısının yalnızca bir böleni vardır, bu nedenle iki bölen tanımını karşılamaz. Doğru bir program 1, 0 ve her negatif tam sayı için false döndürmelidir.

Bölenler çiftler halinde bulunur. Karekökten büyük bir çarpan varsa, onun eşi karekökten küçüktür ve zaten test edilmiştir, bu nedenle ek kontroller gerekmez.

Evet. Parametre türünü int'ten long'a değiştirin ve aynı mantığı koruyun. 64 bitten büyük değerler için, deneme bölmesi yerine BigInteger ve isProbablePrime yöntemini kullanın.

Evet. Döngüden önce sayacı tanımlayın, aynı koşulu while döngüsünün başlığına yerleştirin ve sayacı döngünün gövdesi içinde artırın. Çıktı aynı kalacaktır.

Genellikle evet, ancak üretilen kod genellikle 0, 1 ve negatif girdiler için koruma mekanizmasını atlıyor. Yapay zeka tarafından yazılmış bir uygulamayı kabul etmeden önce her zaman sınır testlerini kendiniz çalıştırın.

Asal sayılar, model API'lerini ve depolanan veri kümelerini koruyan karma fonksiyonlarının, rastgele sayı üretiminin ve RSA şifrelemesinin temelini oluşturur. Anahtarları eşit şekilde dağıtmak için karma tablo boyutları genellikle asal sayılar olarak seçilir.

Bu yazıyı şu şekilde özetleyin: