GENERATORE NUMERI PRIMI

di il
20 risposte

20 Risposte - Pagina 2

  • Re: GENERATORE NUMERI PRIMI

    Si funziona.Intendevo a livello computazionale.In ogni caso cerco sempre per quanto possibile di far a modo mio.
  • Re: GENERATORE NUMERI PRIMI

    Ok, ora è chiaro che stai trollando. Grazie per aver chiarito la tua posizione
  • Re: GENERATORE NUMERI PRIMI

    complicato ha scritto:


    Si funziona.Intendevo a livello computazionale.In ogni caso cerco sempre per quanto possibile di far a modo mio.
    Il crivello di Eratostene serve proprio per evitare una cosa: le divisioni ! (e l'operatore % fa una divisione).

    Quindi se vuoi fare questo crivello, fai il doppio ciclo "for" annidato. C'è un motivo ben preciso. Se i valori che vuoi trattare vanno es. da 2 a 999, il ciclo for esterno fa andare una variabile da 2 a 31 (31 è l'intero della radice quadrata di 999) mentre il ciclo interno serve a "barrare" (mettere a true nel boolean[]) tutti i multipli di quel valore. E come ottimizzazione, ovviamente, solo SE il valore non è già barrato (perché vuol dire che è già lui un multiplo e quindi puoi saltare il ciclo interno).


    P.S. quando fai new boolean [100] gli elementi sono GIÀ al loro valore di default, cioè false. Quindi non serve un (inutile) ciclo per settare false.

    P.S. 2: il codice che hai postato prima NON è corretto (almeno non completamente), perché fa saltare fuori 49, 77 e 91 che NON sono primi.
  • Re: GENERATORE NUMERI PRIMI

    Grazie per i preziosi consigli andbin
  • Re: GENERATORE NUMERI PRIMI

    Ho fatto come hai detto. Codice testato e risulta funzionante. Lo posto per evitare in futuro di riaprire una discussione a riguardo, da altri.
    CODICE SORGENTE:
    public class CrivelloDiEratostene
    {
    public static void main (String args[])
    {
    int indice;
    int x; //INDICE X MULTIPLO
    int multiplo;
    boolean valori [] = new boolean [100];

    for ( indice = 2; indice < Math.sqrt(100); ++indice )
    if ( valori [indice] == false)
    for ( multiplo = 2; (x = indice * multiplo) < 100; ++multiplo)
    valori [x] = true;

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

    complicato ha scritto:


    Codice testato e risulta funzionante. Lo posto per evitare in futuro di riaprire una discussione a riguardo, da altri.
    Il tuo codice, anche se "funziona" in realtà NON dovrebbe essere preso certo come riferimento. Hai fatto diverse cose inutili e comunque non hai seguito cosa ho detto prima.

    Per prima cosa, hai fatto un array di 100 boolean, quindi il massimo rappresentabile come indice è 99 ma poi hai fatto sqrt(100) che è corretto solo perché poi hai fatto indice < x. Ma in generale dovresti prendere la radice del valore massimo, trattarla come "intero" e usarla "inclusivamente".

    Poi hai usato ben 3 moltiplicazioni (ti assicuro che non servono ... al massimo una). E comunque una cosa non l'hai compresa. Nel corpo del ciclo esterno, la prima cosa da fare è testare se il valore è già "barrato" (cioè nell'array valori[indice] è true), perché se è così, quel valore è già un multiplo di un altro valore precedente e quindi il ciclo interno non serve farlo!

    Se vuoi veramente programmare, devi anche saper "ragionare".
Devi accedere o registrarti per scrivere nel forum
20 risposte