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: