Visualizzazione risultati 1 fino 8 di 8

Discussione: [php] errore divison by 0

  1. #1
    Guest

    Predefinito [php] errore divison by 0

    Ciao,
    ho fatto questo codice per salvare i numeri primi (secondo il crivello di eratostene) in un array, nn capisco perché mi da error divison by 0, mi potete controllare? grazie:
    Codice PHP:
    $numeri_primi = array();
    $numeri_primi[0] = 2;

    $c = 0;

    for (
    $i = 3; $i <= 100; $i++) {

    if (
    $i%$numeri_primi[$c] > 0) {
    $numeri_primi[$c] = $i;
    $c++;
    }

    }

  2. #2
    Guest

    Predefinito

    E' logicamente sbagliato, devi controllare con tutti i numeri primi che hai e non con uno solo (come fai ora).
    Codice PHP:
    <?php
    $numeri_primi
    = array();
    $numeri_primi[0] = 2;

    $flag = false;

    for(
    $i = 3;$i<=100;$i++) {
    $flag = false;
    for(
    $j = 0;$j<count($numeri_primi);$j++) {
    if(!(
    $i%$numeri_primi[$j])) {
    $flag = true;
    break;
    }
    }
    if(!
    $flag) $numeri_primi[] = $i;
    }
    print_r($numeri_primi);
    ?>

  3. #3
    Guest

    Predefinito

    quindi come faccio ad usare il risultato come array normale? cioe come stampare $array[0] ???
    poi i spieghi che fa $flag??? grazie..

    EDIT: cioè devo scegliere unn numero rand() tra i numeri che vengono a formarsi, su quale array posso farl?
    Ultima modifica di bluster : 17-02-2009 alle ore 19.22.33

  4. #4
    Guest

    Predefinito

    $flag indica se il numero su cui itera è divisibile o no per un altro, se lo è non è primo, altrimenti si.

    Per la seconda richiesta usi array rand

  5. #5
    Guest

    Predefinito

    perché array_rand($numeri_primi); mi ritorna anche numeri nn primi e che nn sono presenti nell'array???
    nn capisco...grazie dell'aiutoo...ciaoo!

    EDIT: penso di aver risolto così: $numeri_primi[rand(0,count($numeri_primi)-1)];
    cmq se avete idee migliori sono ben accettate... grazie...ciaoo!

    EDIT Scusate, volevo editare, mi sono accorto molto tardi...
    Ultima modifica di debug : 18-02-2009 alle ore 01.47.22

  6. #6
    Guest

    Predefinito

    Dovrebbe rispettare le caratteristiche del crivello di erastotene

    Codice PHP:
    <?php

    $quanti
    = 50;
    $numeri = array();

    for(
    $i=2;$i<=($quanti+2);$i++){
    if(
    $i==$quanti)
    $numeri[$i][0] = "fine";
    else
    $numeri[$i][0] = $i;
    }
    $num_elem = count($numeri);
    $i=2;
    while(
    $i<$num_elem && ($i*$i) < $quanti){
    echo
    $i*$i."<".$quanti."<br>";
    if(
    $numeri[$i][0]!="fine"){
    $n=$numeri[$i][0];
    $j=2;

    while(
    $j<$num_elem){
    if((
    $numeri[$j][0] > 0) && ($n != $j) && ($numeri[$j][1] != "multiplo") && ($j% $n) == 0){
    echo
    $j."/".$n."<br>";
    $numeri[$j][1] = "multiplo";
    }
    $j++;
    }
    }
    $i++;

    }


    for(
    $i=2;$i<$num_elem;$i++)
    echo
    $numeri[$i][0]."=".$numeri[$i][1]."<br>";

    $i=0;
    $j=0;
    while(
    $numeri[$j][0] != "fine"){
    if(
    $numeri[$j][1] != "multiplo"){
    $numeri_primi[$i]=$numeri[$j][0];
    $i++;
    }
    $j++;
    }

    $num_elem = count($numeri_primi);
    for(
    $i=2;$i<$num_elem;$i++) echo ",".$numeri_primi[$i];
    echo
    ".";
    ?>
    Ultima modifica di Xsescott : 18-02-2009 alle ore 05.19.46

  7. #7
    Guest

    Predefinito

    mi sembra tu stia complicando le cose, i risultati che ottengo sono giusti:
    Codice PHP:
    function Numero_Primo () {

    $numeri_primi = array();
    $numeri_primi[0] = 2;

    $flag = false;

    for(
    $i = 3; $i <= 100; $i++) {

    $flag = false;
    for(
    $j = 0; $j < count($numeri_primi); $j++) {

    if(!(
    $i%$numeri_primi[$j])) {
    $flag = true;
    break;
    }

    }

    if(!
    $flag) $numeri_primi[] = $i;

    }

    return
    $numeri_primi[rand(0,count($numeri_primi)-1)];

    }

    do {

    $p = Numero_Primo();
    $q = Numero_Primo();

    } while (
    $p == $q);

    echo
    $p.' '.$q;

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da bluster Visualizza messaggio
    mi sembra tu stia complicando le cose, i risultati che ottengo sono giusti:
    Codice PHP:
    function Numero_Primo () {

    $numeri_primi = array();
    $numeri_primi[0] = 2;

    $flag = false;

    for(
    $i = 3; $i <= 100; $i++) {

    $flag = false;
    for(
    $j = 0; $j < count($numeri_primi); $j++) {

    if(!(
    $i%$numeri_primi[$j])) {
    $flag = true;
    break;
    }

    }

    if(!
    $flag) $numeri_primi[] = $i;

    }

    return
    $numeri_primi[rand(0,count($numeri_primi)-1)];

    }

    do {

    $p = Numero_Primo();
    $q = Numero_Primo();

    } while (
    $p == $q);

    echo
    $p.' '.$q;
    Quello che volevi tu allora era diverso:
    "Il procedimento è il seguente: si scrivono tutti i naturali a partire da 2 fino n in un elenco detto setaccio (in programmazione spesso l'elenco è implementato da un array). Poi si cancellano (setacciano) tutti i multipli del primo numero del setaccio (escluso lui stesso). Si prosegue così fino ad arrivare in fondo. I numeri che restano sono i numeri primi minori od uguali a n. È come se si utilizzassero dei setacci a maglie via via più larghe: il primo lascia passare solo i multipli di 2, il secondo solo i multipli di 3, e così via."

    fonte:http://it.wikipedia.org/wiki/Crivello_di_Eratostene

    io per comodità ho usato un array multidimensionale e poi ho copiato tutto in un'altro array, ma la cosa si può ottimizzare tranquillamente come da wiki.
    Saluti.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •