Visualizzazione dei risultati da 1 a 8 su 8

Discussione: crivello di eratostene

  1. #1

    crivello di eratostene

    Ciao a tutti,

    ho cominciato a studiare il Php da pochi giorni, non avendo nessuna esperienza di programmazione, quindi scusatemi se i miei problemi vi sembreranno banali. Non riesco ad implementare il Crivello di Eratostene. Ho creato un vettore contenente i primi n numeri, con n che è preso in input da un form. Poi ho creato un ciclo for che dovrebbe eliminare dal vettore tutti i multipli dei numeri compresi tra 2 e n/2 in modo da far sì che nel vettore rimangano solo i numeri primi. Perché non funziona?

    <?php

    $n = $_POST["eratostene"];
    if(is_numeric($n))
    {
    for ($p=1; $p<=$n; $p++)
    {$primes[]=$p;}


    for ($i=2; $i<=$n/2; $i++)
    {
    function mult($var)
    {return($var % $i != 0);}
    array_filter($primes,"mult");
    }

    $cnt=count($primes);
    for ($j=0; $j<=$cnt; $j++)
    {echo $primes[$j]." ";}
    }
    else
    {echo "Error: please insert a positive integer!";}
    ?>

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    "non funziona" non ha alcun significato.
    Che intendi dire? Hai dei risultati inattesi? Messaggi d'errore? Che altro?

  3. #3

    Re: crivello di eratostene

    Originariamente inviato da cobblestone
    Perché non funziona?
    "Non funziona" non vuol dire nulla! Qual'è il problema?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  4. #4
    appaiono questi messaggi d'errore:

    Notice: Undefined variable: i in C:\Programmi\EasyPHP-12.1\www\my portable files\exercises.php on line 118

    Warning: Division by zero in C:\Programmi\EasyPHP-12.1\www\my portable files\exercises.php on line 118

  5. #5

    Re: crivello di eratostene

    Originariamente inviato da cobblestone
    Ciao a tutti,

    Codice PHP:
    for ($i=2$i<=$n/2$i++)
    {
    function 
    mult($var)
    {return(
    $var $i != 0);}
    array_filter($primes,"mult");


    ?>
    per iniziare, possiamo notare che se dichiari una funzione dentro un ciclo for
    poi non ti puoi aspettare di riuscire ad usare l'indice $i del ciclo nel corpo della funzione!

  6. #6
    Ah ok! Adesso provo a modificare il codice.

  7. #7
    e non è corretto nemmeno definire la funzione con un parametro $div e
    poi far cambiare il divisore ad ogni ciclo in questo modo


    function mult($var,$div){return($var % $div != 0);}

    for ($i=2; $i<=$n/2; $i++)
    {
    array_filter($primes,"mult(,$i)");
    }


    array_filter non può essere applicato con funzioni che dipendono da più di un parametro?

    devo cercare un altro metodo?

    grazie philbert

  8. #8
    Alla fine sono riuscita a trovare un algoritmo per calcolare tutti i numeri primi minori di un certo $n dato in input. Ho risolto in questo modo:

    $n = $_POST["eratostene"];
    if(is_numeric($n))
    {
    for ($p=2; $p<$n; $p++)
    {$primes[]=$p;}

    function IsPrimeLessThenN($var){
    $n = $_POST["eratostene"];
    for ($i = 2; $i <= min($n/2,$var); $i++)
    {if($var % $i != 0 || $var == $i)
    {$boolean = true;
    continue;}
    else
    {$boolean = false;
    break;}
    }
    return $boolean;}

    $primes=array_filter($primes,"IsPrimeLessThenN");

    echo "The primes less then $n are ";
    foreach($primes as $prime)
    {echo $prime . " ";}
    }
    else
    {echo "Error: please insert a positive integer!";}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.