/** * legge da standard input un numero intero positivo n * e stampa a standard output i numeri primi fra 1 * e n (n compreso). * La stampa e' effettuata su 10 colonne e ciascun numero * ha almeno 5 caratteri (spazi a sinistra se i caratteri sono meno) * * @author Adriano Luchetta * @version 18-Ott-2003 * @version 28-Ott-2003 */ /* per verificare se un numero intero k e' primo si divida k per i numeri interi dell'insieme J = {j | j >= 2 && j*j <= k}. L'algoritmo non e' efficiente. L'algoritmo del Crivello di Eratostene sarebbe piu' efficiente, ma non sappiamo ancora programmarlo. */ import java.util.Scanner; public class EnumeratoreNumeriPrimi { public static void main(String[] args) { final int CARATTERI_PER_NUMERO = 5; final int NUMERO_COLONNE = 10; Scanner in = new Scanner(System.in); System.out.println("**************************************************"); System.out.println("*** Elenco dei numeri primi fra 1 e n compreso ***"); System.out.println("**************************************************"); System.out.println(""); System.out.print("n?: "); int n = in.nextInt(); if (n < 1) { System.out.println("valore non valido"); return; } int count = 0; //variabile per contare i numeri primi for (int k = 1; k < n + 1; k++) // k < n + 1 per comprendere n { if (isPrime(k)) { count++; // incremento il contatore dei numeri primi String kString = String.valueOf(k); // per convertire int k in stringa while (kString.length() < CARATTERI_PER_NUMERO) kString = " " + kString; String separatore = " "; if (count % NUMERO_COLONNE == 0) separatore = "\n"; System.out.print(kString + separatore); } } } /* Metodo predicativo che riconosce se un numero e' primo. Spesso i metodi predicativi della libreria standard hanno un nome che inizia per is o has. Il metodo e' privato (si puo' usare solo nella classe). Deve essere dichiarato statico perche' esegue elaborazione solo sul parametro esplicito e non ha un parametro implicito. Rende piu' leggibile il codice del metodo main. */ private static boolean isPrime(int p) { int j = 2; while (j * j <= p) { if (p % j == 0) return false; // se esiste un divisore il numero non e' primo j++; } return true; } }