GENERATORE NUMERI PRIMI

di il
20 risposte

GENERATORE NUMERI PRIMI

Salve. A me sembra tutto corretto e intanto non va. L'output dovrebbe dare tutti i numeri primi minori di 100 ed invece trovo in ogni indice dell'array il numero zero. Premetto ho cominciato da poco java (conosco il C) e l'algoritmo sicuramente non è ottimizzato, però attualmente mi interessa il funzionamento. Ringrazio in anticipo

CODICE SORGENTE:
public class primi
{
public static void main (String args[])
{
//DICHIARAZIONE E INIZIALIZZAZIONE
int number, i;
int verifica = 0;
int indicenp = 2;
int numeriprimi [];
numeriprimi = new int[50];

numeriprimi [0] = 2;
numeriprimi [1] = 3;

//CALCOLO NUMERI PRIMI
for ( number = 4; number <= 100; ++number)
{
for ( i = 0; i < indicenp; ++i)
if ( number % numeriprimi == 0)
++verifica;

if ( verifica == 0)
{
numeriprimi [indicenp] = number;
++indicenp;
verifica = 0;
}
}

//STAMPA
for ( i = 0; i < indicenp; ++i)
System.out.println(numeriprimi);
}
}

20 Risposte

  • Re: GENERATORE NUMERI PRIMI

    Innanzitutto il tuo codice è sbagliato ad esempio nella gestione della variabile verifica.

    Ma a parte questo e giusto per chiarire: nell'approccio classico/basilare, se hai un valore x che vuoi verificare se primo, devi "provare" tutte le divisioni x / y dove y deve andare da 2 a x/2 compresi. SE una di queste divisioni (basta la prima che trovi) dà resto 0 .... x non è primo.

    Ma se hai N valori da verificare da 2 in avanti, allora vedi: https://it.wikipedia.org/wiki/Crivello_di_Eratosten
  • Re: GENERATORE NUMERI PRIMI

    Piccolo appunto: non è necessario testare tutti i numeri fino a x / 2. E' sufficiente fermarsi a vx (così si risparmia qualche inutile test).

    Ciao.
  • Re: GENERATORE NUMERI PRIMI

    LeleFT ha scritto:


    E' sufficiente fermarsi a vx
    Vero! Lo sapevo ... non mi è venuto in mente prima ed ho scritto velocemente x/2
    Thanks Lele
  • Re: GENERATORE NUMERI PRIMI

    Grazie per le risposte. Ho capito il problema. Praticamente la variabile verifica aumentava di 1 visto che il 4 non è un numero primo, pero non vi era un istruzione che la riponeva uguale a zero. Infatti adesso il prompt visualizza bene tutti i numeri primi. In ogni caso adesso proverò a sfruttare l'algoritmo di Eratostene a titolo istruttivo. UN ultima cosa, sono nuovo di questo forum , avete consigli per quanto riguarda il rispetto delle regole?? Ad esempio come si formatta il codice sorgente??
  • Re: GENERATORE NUMERI PRIMI

    complicato ha scritto:


    Ad esempio come si formatta il codice sorgente??
    La questione è a diversi livelli. C'è banalmente la questione "strutturale": spaziature, posizione delle { }, ecc... E poi c'è la questione delle "denominazioni".

    Comunque:
    https://www.oracle.com/technetwork/java/codeconvtoc-136057.html

    (nota: dice "for Archive Purposes" .. "not being actively maintained" ma non farti ingannare. Quel documento è ancora "attualissimo" anche al giorno d'oggi. Le convenzioni sono sempre state quelle, che sono ormai riconosciute e accettate)
  • Re: GENERATORE NUMERI PRIMI

    Ho concluso l'esercizio con il metodo del crivello di Eratostene. L'approccio che ho avuto diciamo è stato inverso. Non ho puntato sui multipli bensi sui divisori. Il ragionamento di base è che se un numero è divisibile per 2 , allora non è detto sia divisibile per un multiplo di 2, però se un numero non è divisibile per 2 allora sicuramente non è divisibile per un multiplo di 2: Quindi i numeri da dividere per sapere se un numero è un numero primo o no, sono 2 3 e 5.
    Ho preferito stampare immediatamente una volta verificato è un numero primo, poiché introdurre un indice è un po scomodo.

    CODICE SORGENTE:

    public class crivello
    {
    public static void main (String args[])
    {
    int number;

    for ( number = 2; number < 30; ++number)
    if ( number == 2 || number == 3 || number == 5)
    System.out.println(number);
    else if ( number % 2 == 0 || number % 3 == 0 || number % 5 == 0 )
    continue;
    else
    System.out.println(number);

    }
    }
  • Re: GENERATORE NUMERI PRIMI

    Complicato, nomen omen
    Quindi 5 non è primo? Quanto fa 5 % 5 ?
  • Re: GENERATORE NUMERI PRIMI

    Errore mio ahahah. Cmq risolto basta aggiungere "number == 5" nel primo if.
  • Re: GENERATORE NUMERI PRIMI

    Comunque quello del 2, 3 e 5 si fa così
    
    static boolean primo(int n){
    if(n<2) return false;
    if(n<4) return true;
    if(n%2 == 0 || n%3 == 0) return false;
    
    for(int i=5; i*i<=n; i+=6)
         if(n%i == 0 || n%(i+2) == 0)
             return false;
    
    return true;
    }
    
  • Re: GENERATORE NUMERI PRIMI

    complicato ha scritto:


    Ho concluso l'esercizio con il metodo del crivello di Eratostene.
    Il crivello di Eratostene si implementa di norma con un array (vettore/lista/.. a seconda del linguaggio). Serve spazio di "memoria" per rappresentare subito tutti i valori e poterli poi "barrare" uno per uno al fine di scartarli se non primi ....
  • Re: GENERATORE NUMERI PRIMI

    Si diciamo ho preso spunto. Ma non so quanto convenga inizializzare tutti i numeri manualmente oppure con un ciclo. E poi andarli ad eliminare. Si creerebbe un casino per stampare solo le posizioni occupate dai solo numeri primi. Certo io sono un ragazzo che ha cominciato da poco java, probabilmente con qualche magheggio di programmazione e una buon sana padronanza del linguaggio, si può fare.
  • Re: GENERATORE NUMERI PRIMI

    complicato ha scritto:


    Ma non so quanto convenga inizializzare tutti i numeri manualmente oppure con un ciclo.
    Basta, banalmente un array di boolean, dove l'indice è anche il valore stesso da trattare (ignorando 0 e 1). All'inizio i boolean nell'array sono già tutti false (=non barrato). Poi servono 2 piccoli cicli annidati per barrare (=true) tutti i non primi.
    Quindi alla fine, per stampare, un ciclo per andare a cercare i valori non "barrati". Sono circa max 20 righe di codice .....

    E se vuoi fare prima esercizi sugli array: https://andbin.it/blog/tag/esercizi-jav
  • Re: GENERATORE NUMERI PRIMI

    Grazie per il prezioso consiglio. E pensandoci è geniale quasi. Ho provato a farlo seguendo il tuo consiglio. Dimmi come ti sembra. (ho messo tra i preferiti il tuo blog di programmazione )
    CODICE SORGENTE:
    public class crivello1
    {
    public static void main (String args[])
    {
    int indice;
    boolean valori [] = new boolean [100];

    for ( indice = 0; indice < 100; ++indice )
    valori [indice] = false;

    for ( indice = 0; indice < 100; ++indice )
    {
    if ( indice < 2 )
    valori [indice] = false;
    else if ( indice == 2 || indice == 3 || indice == 5 )
    valori [indice] = true;
    else if ( indice % 2 == 0 || indice % 3 == 0 || indice % 5 == 0 )
    valori [indice] = false;
    else
    valori [indice] = true;
    }

    for ( indice = 0; indice < 100; ++indice )
    if ( valori [indice] == true )
    System.out.println(indice);
    }
    }
  • Re: GENERATORE NUMERI PRIMI

    Scusa, ma perché non lo testi il tuo codice prima di chiedere indicazioni? Il risultato è corretto?
    ... che poi andbin ti aveva detto che il crivello si fa con due for annidati e non li hai fatti. Perché?
Devi accedere o registrarti per scrivere nel forum
20 risposte