Java Programma per verificare i numeri primi con esempio

⚡ Riepilogo intelligente

Java Il programma per verificare la primalità dei numeri dimostra come un singolo numero intero venga testato per la divisibilità e classificato come primo o composto. Questo articolo tratta la definizione matematica, la logica del ciclo, il codice completo ed eseguibile, l'ottimizzazione tramite radice quadrata, il confronto della complessità e gli errori più comuni commessi dai principianti.

  • 🔢 Regola di definizione: Un numero primo è un numero naturale maggiore di 1 che ha esattamente due divisori, ovvero 1 e il numero stesso.
  • 🔁 Logica del ciclo: Dividi il candidato per ogni numero intero da 2 fino alla metà del numero e registra se uno qualsiasi dei resti è uguale a zero.
  • 🚩 Modello della bandiera: Una variabile booleana memorizza il verdetto e l'istruzione break esce dal ciclo nel momento in cui viene trovato un divisore.
  • Ottimizzazione della radice quadrata: Testare i divisori solo fino alla radice quadrata riduce il numero di iterazioni da n/2 a √n senza modificare il risultato.
  • ⚠️ Casi limite: Zero, uno e i valori negativi non sono mai numeri primi, mentre 2 è l'unico numero primo pari.
  • Confronto di complessità: Il ciclo base ha una complessità temporale di O(n) e il metodo della radice quadrata di O(√n).
  • 🧪 Procedura di verifica: Eseguire i test con 1, 2, 9, 17 e 97 per confermare ogni condizione al contorno.

Java Programma per controllare il numero primo

Cos'è un numero primo?

Un numero primo è un numero naturale maggiore di 1 che è divisibile solo per 1 o per se stesso. Ad esempio, 11 è divisibile solo per 1 o per se stesso. Altri numeri primi sono 2, 3, 5, 7, 11, 13, 17 e la sequenza continua all'infinito.

Un numero maggiore di 1 che non è primo è detto numero composto, perché può essere composto da fattori più piccoli. Il valore 9 è composto perché è divisibile esattamente per 3, e 15 è composto perché è divisibile esattamente per 3 e 5.

Nota: 0 e 1 non sono numeri primi. 2 è l'unico numero primo pari e i valori negativi non sono mai considerati primi.

Come verificare se un numero è primo in Java

La strategia di verifica consiste in un semplice test di divisibilità. Si prende il valore candidato, lo si divide a turno per ciascun numero intero più piccolo e si esamina il resto restituito dall'operatore modulo. Un resto pari a zero dimostra che esiste un divisore, il che esclude immediatamente il numero.

Logica del programma:

  • Dobbiamo dividere un numero dato, ad esempio 17, per i valori compresi tra 2 e 17 e controllare il resto. Se il resto è 0, il numero non è primo.
  • Nessun numero è divisibile per più della metà di se stesso. Quindi dobbiamo farlo loop attraverso solo numberToCheck/2Se l'input è 17, la metà è 8.5 e il ciclo scorrerà i valori da 2 a 8.
  • Se numberToCheck è completamente divisibile per un altro numero, il flag isPrime è impostato su false e si esce dal ciclo.

Due Java le caratteristiche trasportano l'intero algoritmo. L'operatore modulo % restituisce il resto di una divisione intera e il break L'istruzione interrompe il ciclo non appena si conosce la risposta, evitando così l'esecuzione di iterazioni non necessarie.

Java Programma per verificare se un numero è primo o meno

Il programma seguente assegna il valore 17 alla variabile numberToCheck e stampa ogni passaggio della divisione, in modo da poter seguire il ragionamento riga per riga. Il codice è modificabile, quindi cambia il valore ed eseguilo di nuovo con un numero composto come 21 per vedere il risultato opposto.

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

Uscita prevista:

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

Il ciclo si interrompe a 8 perché 17 diviso 2 è uguale a 8 nell'aritmetica intera. Poiché nessun resto è mai stato zero, il flag isPrime mantiene il suo valore iniziale di true e la condizione finale stampa il verdetto positivo.

Verifica ottimizzata dei numeri primi utilizzando il metodo della radice quadrata

Dividere fino a metà del numero è corretto ma inefficiente. Se un numero n ha un divisore maggiore della sua radice quadrata, il codivisore corrispondente deve essere minore della radice quadrata, quindi sarebbe già stato trovato. Verificare fino a √n produce quindi lo stesso risultato con molte meno iterazioni.

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

Produzione:

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

La condizione i * i <= n Evita una chiamata a Math.sqrt in virgola mobile e il passo di 2 salta ogni divisore pari. Per un valore come 1,000,003, il ciclo base esegue circa 500,000 iterazioni, mentre questa versione ne esegue meno di 500.

Verifica un numero primo inserito dall'utente

L'input codificato in modo statico è comodo per le dimostrazioni, ma gli esercizi reali di solito richiedono l'input da tastiera. La classe Scanner legge un numero intero dalla console e lo passa allo stesso metodo 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();
    }
}

Esecuzione di esempio:

Enter a number: 29
29 is a Prime number

Suggerimento: Inizializzazione della bandiera con number > 1 Gestisce i valori 0, 1 e tutti gli input negativi in ​​un'unica espressione, eliminando la necessità di una clausola di guardia separata.

Errori comuni nella scrittura di un programma sui numeri primi

La maggior parte degli invii errati fallisce a causa dei valori limite piuttosto che nel ciclo principale. L'elenco seguente riporta gli errori che si verificano più frequentemente nel codice dei principianti.

  1. Inizio del ciclo da 1: Ogni numero intero è divisibile per 1, quindi il flag viene impostato immediatamente su falso e il programma segnala che nessun numero è primo.
  2. Considerando 1 come numero primo: Il valore 1 ha un solo divisore, quindi non soddisfa la definizione di due divisori e deve restituire false.
  3. Omettendo l'istruzione break: Il programma restituisce comunque la risposta corretta, ma continua a iterare anche dopo che il verdetto è noto, il che spreca tempo con input di grandi dimensioni.
  4. utilizzando i <= n come limite: Il numero è sempre divisibile per se stesso, quindi il ciclo deve interrompersi prima di raggiungere n.
  5. Confronto con = invece di ==: Un singolo segno di uguale assegna un valore anziché verificarlo, il che produce un errore in fase di compilazione nella condizione if.

Confronto tra metodi di verifica della primalità

Scegli il metodo più adatto alla dimensione dei dati di input e alla necessità di testare un singolo valore o un intero intervallo.

Metodo Gamma di divisori testata Complessità temporale Adatto a
Ciclo base da 2 a n-1 O (n) Apprendimento della logica di base
Mezza divisione da 2 a n/2 O (n) Input ridotti, codice semplice
Metodo della radice quadrata da 2 a √n O(√n) Valori singoli di grandi dimensioni
Setaccio di Eratostene Tabella precalcolata O(n log log n) Elenco di tutti i numeri primi in un intervallo

Quando è necessario classificare un intero intervallo anziché un singolo valore, il setaccio è molto più efficiente. Il nostro programma complementare per trovare Prima Numbers da 1 a 100 dimostra quello schema. Per esercizi correlati basati su cicli, rivedere il serie di Fibonacci in Java, il Java programma palindromo Bubble Algoritmo di ordinamento in Java. I principianti che hanno bisogno di un ripasso sulla dichiarazione della bandiera e del contatore dovrebbero leggere di Java variabili nel principale Java lezione.

DOMANDE FREQUENTI

No. Il numero 1 ha un solo divisore, quindi non soddisfa la definizione di due divisori. Qualsiasi programma corretto deve restituire false per 1, per 0 e per ogni numero intero negativo.

I divisori si presentano a coppie. Se esiste un fattore maggiore della radice quadrata, il suo complemento è minore della radice quadrata ed è già stato verificato, quindi non sono necessari ulteriori controlli.

Sì. Modifica il tipo di parametro da int a long e mantieni la stessa logica. Per valori superiori a 64 bit, utilizza BigInteger e il suo metodo isProbablePrime al posto della divisione per tentativi.

Sì. Dichiara il contatore prima del ciclo, inserisci la stessa condizione nell'intestazione del while e incrementa il contatore all'interno del corpo del ciclo. L'output rimane identico.

Solitamente sì, anche se il codice generato spesso omette la protezione per gli input 0, 1 e negativi. Esegui sempre tu stesso i test sui limiti prima di accettare un'implementazione scritta dall'IA.

I numeri primi sono alla base delle funzioni di hashing, della generazione di numeri casuali e della crittografia RSA, che proteggono le API dei modelli e i set di dati archiviati. Le dimensioni delle tabelle hash vengono spesso scelte come numeri primi per distribuire uniformemente le chiavi.

Riassumi questo post con: