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.

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
falsee 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.
- 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.
- Considerando 1 come numero primo: Il valore 1 ha un solo divisore, quindi non soddisfa la definizione di due divisori e deve restituire false.
- 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.
- utilizzando
i <= ncome limite: Il numero รจ sempre divisibile per se stesso, quindi il ciclo deve interrompersi prima di raggiungere n. - 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.
