Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    12

    [PHP] Problema non bene identificato

    Codice PHP:
    <?php
    $num 
    $_POST['numero'];
    $num2 $num

    $div 2;
    while ((
    $num2 != 1) and ($div 100))
    {
    $num2 $num2 $div;

    if (
    is_int($num2)) {

    echo 
    "$div
    "
    ;
    $div 2;
    continue;}

    $div++; }
    ?>
    Vorrebbe essere uno scriptino per calcolare i divisori primi di qualunque numero. Il punto è che funziona solo con multipli di 2, perché i numeri dispari non li calcola minimamente.

    Cos'è sbagliato?

  2. #2
    Quando fallisce il controllo is_int($num2) dovresti rimettere a posto il valore di num2. A questo proposito credo che tu all'inizio ne abbia fatto una copia, sbaglio?

    EDIT

    E poi mi sembra che non funzioni bene per i fattori con potenza superiore a uno.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    12
    Ehm, una copia di cosa? °°'

  4. #4
    Originariamente inviato da Amsirak
    Ehm, una copia di cosa? °°'
    Fai una simulazione. Metti 9, che è 3 alla seconda.
    Lo script entra nel ciclo, prende il 9 e lo divide per due e mette il risultato dentro $num2. La condizione dell'if è falsa, si va avanti, il divisore viene incrementato e si passa alla prossima iterazione.
    Ma dentro $num2 c'è quattro e mezzo...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    12
    Codice PHP:
    <?php
    $num 
    $_POST['numero'];
    $num2 $num


    $div 2;
    while ((
    $num2 != 1) and ($div 100)) {
    $num2 $num2 $div;

    if (
    is_int($num2)){
    echo 
    "$div
    "
    ;
    $div 2;
    continue;} 

    $num2 $num2 $div;
    $div++;} 

    ?>
    Questo:

    "$num2 = $num2 * $div;" Rimoltiplica il $num2 attuale (4,5) * il $div attuale (2).

    O almeno dovrebbe, ma non è ancora cambiato niente da prima...

  6. #6
    Allora, intanto non avevo visto il continue, quindi non mi ero accorto che il divisore giustamente non veniva incrementato in caso di quoziente intero. Mi rimangio quello che ho detto per le potenze superiori...

    Riguardo a rimoltiplicare per il divisore al fine di riottenere il numero intatto dubito che la cosa funzioni, per via della rappresentazione dei numeri all'interno del calcolatore. Ma non conosco l'implementazione di PHP e non so se è un aspetto critico... so solo che fare in sequenza una divisione e poi l'inverso per ottenere il risultato di partenza è una cosa su cui non si dovrebbe fare affidamento.
    Prova a conservare una copia del valore da ripristinare, così capiamo se è effettivamente questo il problema.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    12
    Prova a conservare una copia del valore da ripristinare
    Cosa significa?

  8. #8
    Questo vuol dire

    Codice PHP:
    while (($num2 != 1) and ($div 100)) {
    $copia $num2;
    $num2 $num2 $div;

    if (
    is_int($num2)){
    echo 
    "$div
    "
    ;
    $div 2;
    continue;}

    $num2 $copia;
    $div++;} 

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    12
    Grazie mille, adesso funziona. Ho iniziato solo ieri col php, questo è il secondo script che faccio. Mi hai aperto un mondo con la storia di fare una copia del valore

  10. #10
    Originariamente inviato da Amsirak
    Grazie mille, adesso funziona. Ho iniziato solo ieri col php, questo è il secondo script che faccio. Mi hai aperto un mondo con la storia di fare una copia del valore
    Se è per questo io ho iniziato l'altro ieri... ...però vengo da altri linguaggi.
    Questo di non fare affidamento sul perfetto comportamento matematico dei numeri è una cosa che vale in generale: i numeri dentro il calcolatore hanno una precisione finita, e bisogna tenerne conto.

    EDIT

    Ah... e comunque, a parte il problema della precisione che può diventare critico con particolari numeri, nel tuo script c'era sempre e comunque il problema che la variabile $num2 alla prima divisione veniva trasformata in float. Rimoltiplicarla per il suo divisore, anche quando ciò dovesse dare l'esatto risultato di partenza, non la farebbe ridiventare di tipo int e la funzione da te usata (is_int) controlla il tipo, non fa altro.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.