Java Program pro kontrolu prvočísla s příkladem

⚡ Chytré shrnutí

Java Program pro kontrolu prvočísel ukazuje, jak se jedno celé číslo testuje na dělitelnost a klasifikuje jako prvočíslo nebo složené číslo. Tento článek se zabývá matematickou definicí, logikou smyček, kompletním spustitelným kódem, optimalizací druhé odmocniny, porovnáváním složitosti a častými chybami začátečníků.

  • 🔢 Definice pravidla: Prvočíslo je přirozené číslo větší než 1, které má právě dva dělitele, a to 1 a samotné číslo.
  • 🔁 Logika smyčky: Vydělte kandidáta každým celým číslem od 2 do poloviny čísla a zaznamenejte, zda se nějaký zbytek rovná nule.
  • 🚩 Vlajkový vzor: Booleovská proměnná ukládá verdikt a příkaz break ukončí smyčku v okamžiku, kdy je nalezen dělitel.
  • Optimalizace druhé odmocniny: Testování dělitelů pouze do druhé odmocniny snižuje počet iterací z n/2 na √n bez změny výsledku.
  • ⚠️ Okrajová pouzdra: Nula, jedna a záporné hodnoty nikdy nejsou prvočísla, zatímco 2 je jediné sudé prvočíslo.
  • ⏱️ Porovnání složitosti: Základní smyčka běží v čase O(n) a metoda odmocniny v čase O(√n).
  • 🧪 Ověřovací postup: Otestujte s hodnotami 1, 2, 9, 17 a 97, abyste potvrdili každou okrajovou podmínku.

Java Program pro kontrolu prvočísla

Co je prvočíslo?

Prvočíslo je přirozené číslo větší než 1, které je dělitelné pouze 1 nebo samo sebou. Například 11 je dělitelné pouze 1 nebo samo sebou. Další prvočísla jsou 2, 3, 5, 7, 11, 13, 17 a tato posloupnost pokračuje donekonečna.

Číslo větší než 1, které není prvočíslo, se nazývá složené číslo, protože ho lze složit z menších činitelů. Číslo 9 je složené, protože se dělí rovnoměrně 3, a číslo 15 je složené, protože se dělí rovnoměrně 3 a 5.

Poznámka: 0 a 1 nejsou prvočísla. 2 je jediné sudé prvočíslo a záporné hodnoty se nikdy nepovažují za prvočísla.

Jak zkontrolovat, zda je číslo prvočíslo Java

Ověřovací strategie je jednoduchý test dělitelnosti. Vezměte kandidátskou hodnotu, postupně ji vydělte každým menším celým číslem a zkontrolujte zbytek vrácený operátorem modulu. Zbytek nula dokazuje existenci dělitele, což číslo okamžitě diskvalifikuje.

Programová logika:

  • Potřebujeme vydělit vstupní číslo, řekněme 17, hodnotami od 2 do 17 a zkontrolovat zbytek. Pokud je zbytek 0, číslo není prvočíslo.
  • Žádné číslo není dělitelné více než polovinou sebe sama. Takže musíme smyčka přes jen numberToCheck/2Pokud je vstup 17, polovina je 8.5 a smyčka bude iterovat hodnotami 2 až 8.
  • Pokud je numberToCheck zcela dělitelné jiným číslem, příznak isPrime se nastaví na false a smyčka je opuštěna.

Dvě Java Funkce nesou celý algoritmus. Operátor modulu % vrací zbytek po celočíselném dělení a break Příkaz zastaví smyčku, jakmile je známa odpověď, takže se neprovádějí žádné zbytečné iterace.

Java Program pro kontrolu, zda je číslo prvočíslo či nikoli

Následující program přiřadí proměnné numberToCheck hodnotu 17 a vypíše každý krok dělení, takže můžete sledovat uvažování řádek po řádku. Kód je upravitelný, takže změňte hodnotu a spusťte jej znovu se složeným číslem, například 21, abyste viděli opačný výsledek.

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");
    }
  }

Očekávaný výstup:

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

Smyčka se zastaví na čísle 8, protože 17 děleno 2 se v celočíselné aritmetice rovná 8. Protože žádný zbytek nebyl nikdy nula, příznak isPrime si ponechává počáteční hodnotu true a konečná podmínka vypíše kladný výsledek.

Optimalizovaná kontrola prvočísel pomocí metody druhé odmocniny

Dělení čísla až do poloviny je správné, ale nehospodárné. Pokud má číslo n dělitele většího než jeho druhá odmocnina, musí být odpovídající spoludělitel menší než druhá odmocnina, takže by již byl objeven. Kontrola až do √n proto vede ke stejnému výsledku s mnohem menším počtem iterací.

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));
        }
    }
}

Výstup:

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

Kondice i * i <= n Vyhýbá se volání funkce Math.sqrt s plovoucí desetinnou čárkou a krok 2 přeskakuje každého sudého dělitele. Pro hodnotu jako 1 000 003 provede základní smyčka zhruba 500 000 iterací, zatímco tato verze provede méně než 500.

Kontrola prvočísla zadaného uživatelem

Pevně ​​zadaný vstup je vhodný pro demonstrace, ale skutečná cvičení obvykle vyžadují vstup z klávesnice. Třída Scanner načte celé číslo z konzole a předá ho téže metodě isPrime.

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();
    }
}

Ukázkový běh:

Enter a number: 29
29 is a Prime number

💡 Tip: Inicializace příznaku pomocí number > 1 zpracovává hodnoty 0, 1 a všechny záporné vstupy v jednom výrazu, což odstraňuje potřebu samostatné ochranné klauzule.

Časté chyby při psaní programu pro prvočísla

Většina chybných odeslání selže na hraničních hodnotách spíše než v hlavní smyčce. Níže uvedený seznam zahrnuje chyby, které se nejčastěji objevují v kódu pro začátečníky.

  1. Spuštění smyčky od 1: Každé celé číslo se dělí 1, takže příznak se okamžitě nastaví na hodnotu false a program hlásí, že žádné číslo není prvočíslo.
  2. Považání 1 za prvočíslo: Hodnota 1 má pouze jednoho dělitele, takže nesplňuje definici dvou dělitelů a musí vrátit hodnotu false.
  3. Vynechání příkazu break: Program stále vrací správnou odpověď, ale iteruje i poté, co je verdikt znám, což ztrácí čas na velkých vstupech.
  4. Použití i <= n jako hranice: Číslo se vždy dělí samo sebou, takže smyčka se musí zastavit před dosažením n.
  5. Srovnání s = místo ==: Jediné znaménko rovnosti přiřadí hodnotu, nikoli ji otestuje, což v podmínce if způsobí chybu při kompilaci.

Porovnání metod kontroly primárních zdrojů

Vyberte metodu, která odpovídá velikosti vstupu a tomu, zda je třeba testovat jednu hodnotu nebo celý rozsah.

Metoda Testovaný rozsah dělitelů Časová složitost Nejvhodnější pro
Základní smyčka 2 až n-1 O (n) Učení se základní logiky
Poloviční divize 2 až n/2 O (n) Malé vstupy, jednoduchý kód
Metoda druhé odmocniny 2 až √n O(√n) Jednotlivé velké hodnoty
Síto Eratosthenes Předpočítaná tabulka O(n log log n) Výpis všech prvočíslů v daném rozsahu

Pokud je třeba klasifikovat celý rozsah, nikoli pouze jednu hodnotu, je síto mnohem efektivnější. Náš doprovodný program pro nalezení pojistné Numbers od 1 do 100 demonstruje tento vzorec. Související cvičení řízená smyčkami naleznete v Fibonacciho řada v Javase Java palindromový programA Bubble Algoritmus řazení v JavaZačátečníci, kteří si potřebují osvěžit znalosti o deklaraci příznaku a počítadla, by si měli přečíst o Java proměnné v hlavním Java konzultace.

Nejčastější dotazy

Ne. Číslo 1 má pouze jednoho dělitele, takže nesplňuje definici dvou dělitelů. Každý správný program musí vracet false pro 1, pro 0 a pro každé záporné celé číslo.

Dělitelé se vyskytují ve dvojicích. Pokud existuje dělitel větší než druhá odmocnina, jeho partner je menší než druhá odmocnina a byl již otestován, takže nejsou nutné žádné další kontroly.

Ano. Změňte typ parametru z int na long a zachovejte stejnou logiku. Pro hodnoty delší než 64 bitů použijte BigInteger a jeho metodu isProbablePrime místo zkušebního dělení.

Ano. Deklarujte čítač před smyčkou, umístěte stejnou podmínku do hlavičky while a inkrementujte čítač uvnitř těla smyčky. Výstup zůstane identický.

Obvykle ano, i když generovaný kód často vynechává ochranný znak pro vstupy 0, 1 a záporné hodnoty. Před přijetím implementace napsané umělou inteligencí vždy sami spusťte hraniční testy.

Prvočísla jsou základem hašovacích funkcí, generování náhodných čísel a šifrování RSA, které chrání modelová API a uložené datové sady. Velikosti hašovacích tabulek se často volí jako prvočísla pro rovnoměrné rozložení klíčů.

Shrňte tento příspěvek takto: