Numeri di Smith

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (x-reynik-x @ 6/2/2010, 10:23)
    E poi cos'ha il mio test di più dispendioso del tuo? Anche il mio salta tutti i pari!

    Non ho mai detto sia più dispendioso.
    Al contrario, ho detto che in Python ci sono alcune cose più semplificate (vedi l'estrazione dei caratteri per sommarli come interi).
     
    Top
    .
  2. x-reynik-x
     
    .

    User deleted


    Ah ma io mi riferivo a Skydrake
     
    Top
    .
  3. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (x-reynik-x @ 6/2/2010, 10:23)
    E poi cos'ha il mio test di più dispendioso del tuo? Anche il mio salta tutti i pari!

    Si, ma li salta con un If.
     
    Top
    .
  4. x-reynik-x
     
    .

    User deleted


    E un if è più dispendioso? Puoi spiegarmi il tuo codice, non ci capisco niente di VB!! :rolleyes:
     
    Top
    .
  5. ~Andrey™
     
    .

    User deleted


    CITAZIONE (x-reynik-x @ 7/2/2010, 09:28)
    E un if è più dispendioso? Puoi spiegarmi il tuo codice, non ci capisco niente di VB!! :rolleyes:

    Certo, non di poco.

    Comunque il suo codice è semplice:
    CODICE
    x += (x Mod 2 = 0)

    Il risultato dell'espressione tra parentesi è uguale ad 1 quando l'espressione stessa è verificata, cioè quando "x" è pari. In questo caso quindi x diventa "x + 1". Altrimenti resta x.

    Anche se non capisco perchè non usare "Step 2" nel For, ovviamente partendo da 3 ["x Mod 2" si verifica magari all'esterno del For].
     
    Top
    .
  6. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (~Andrey™ @ 7/2/2010, 15:00)
    Anche se non capisco perchè non usare Step 2 nel for :P

    Mettendo Step 2 nel For ci sono due possibilità:
    1. la x assume come valore tutti i numeri pari;
    2. la x assume come valore tutti i numeri dispari.

    Nel mio caso invece deve assumere prima il valore di un numero pari (2) poi il valore di tutti gli altri dispari ;)
    Siccome (almeno a quanto ricordo...è un po' che non programmo) non si può variare lo Step durante il ciclo, mi è venuta in mente solo questa soluzione, ma magari mi sbaglio.

    Hai editato il messaggio! Eresia :P
    Comunque, come avresti intenzione di verificare se x è pari all'esterno del for (chiaramente senza utilizzare un If)?
     
    Top
    .
  7. ~Andrey™
     
    .

    User deleted


    Un If all'esterno del For ci può anche stare, è sempre meno dispendioso, dato che il ciclo viene eseguito la metà delle volte.

    Comunque senza un If potrebbe essere così:

    CODICE
    x = (n Mod 2 = 0) * Sqrt(n) + (n Mod 2) * 3


    Se l'espressione nella prima parentesi da 1 (n è pari), x sarà uguale a "Sqrt(n) + 0", quindi il ciclo non inizia.
    Se l'espressione nella prima parentesi da 0 (n è dispari), n varrà "0 + 3" quindi inizierà il ciclo da 3. :)

    Ci ho messo un po' ad elaborare questa espressione, ma dovrebbe funzionare :P

    PS: Il tuo "Return True" andava dopo il For, anche se sicuramente sarà stata una svista :)
     
    Top
    .
  8.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Ma la tua intenzione è quindi quella di avere x=0 se il numero è pari e x=3 se è dispari?

    Se è così, si potrebbe fare pure in questo modo:

    CODICE
    x = ((n%2)&n)*3;


    Oppure, per non usare %2
    CODICE
    x = (((n>>1)<<1)^n)*3;


    Esempio: n=10;

    Nel primo caso, ottengo il resto in questo caso 0, e lo abbino ad n tramite l'operatore &.
    In pratica 0&10, in bit:
    0000
    &
    1010
    ____
    0000

    Il risultato come si vede è 0, quindi il numero è pari. Se proviamo con n 11 invece accade: (11%2)&11.
    11%2 da resto 1; quindi in binario accade

    0001
    &
    1011
    ____
    0001

    Ottengo 1 e lo moltiplico per 3.

    Nel secondo caso
    CODICE
    x = (((n>>1)<<1)^n)*3;


    Sposto un bit di n a destra, successivamente a sinistra. Lo spostamento a destra di 1 bit divide per 2, lo spostamento a sinistra moltiplica per 1; l'operatore ^ (XOR) restituisce 1 se il bit è esattamente 1.
    Esempio, assumiamo n=10.
    [code]
    ((10>>1)<<1)^n

    Ovvero 10 /2 = 5 *2 = 10. In bit il 10 corrisponde a
    1010
    ^
    1010
    ____
    0000

    Come si vede il risultato è 0.
    Se n fosse stato 11 avrei ottenuto
    1010
    ^
    1011
    ____
    0001

    Ed ecco che il numero è dispari.
     
    Top
    .
  9. ~Andrey™
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 7/2/2010, 18:30)
    Ma la tua intenzione è quindi quella di avere x=0 se il numero è pari e x=3 se è dispari?

    No, se è pari dev'esser x=Sqrt(n), in modo che la condizione del ciclo non è verificata:
    CODICE
    For x As UInt16 = 2 To Math.Sqrt(n)

    Cioè in modo che il ciclo non venga eseguito.
     
    Top
    .
  10. ~{Skydrake™}»
     
    .

    User deleted


    CITAZIONE (~Andrey™ @ 7/2/2010, 19:09)
    Cioè in modo che il ciclo non venga eseguito.

    Ma una volta viene eseguito comunque, no?
     
    Top
    .
  11. ~Andrey™
     
    .

    User deleted


    CITAZIONE (~{Skydrake™}» @ 7/2/2010, 20:07)
    CITAZIONE (~Andrey™ @ 7/2/2010, 19:09)
    Cioè in modo che il ciclo non venga eseguito.

    Ma una volta viene eseguito comunque, no?

    Uhm, sinceramente non saprei, dato che ormai sono abitutato al for in sintassi C-Like, e dato che non posso provare :D
     
    Top
    .
  12. lumo
     
    .

    User deleted


    CITAZIONE (RootkitNeo @ 7/2/2010, 18:30)
    Ma la tua intenzione è quindi quella di avere x=0 se il numero è pari e x=3 se è dispari?

    Se è così, si potrebbe fare pure in questo modo:

    CODICE
    x = ((n%2)&n)*3;


    Oppure, per non usare %2
    CODICE
    x = (((n>>1)<<1)^n)*3;


    Esempio: n=10;

    Nel primo caso, ottengo il resto in questo caso 0, e lo abbino ad n tramite l'operatore &.
    In pratica 0&10, in bit:
    0000
    &
    1010
    ____
    0000

    Il risultato come si vede è 0, quindi il numero è pari. Se proviamo con n 11 invece accade: (11%2)&11.
    11%2 da resto 1; quindi in binario accade

    0001
    &
    1011
    ____
    0001

    Ottengo 1 e lo moltiplico per 3.

    Nel secondo caso
    CODICE
    x = (((n>>1)<<1)^n)*3;


    Sposto un bit di n a destra, successivamente a sinistra. Lo spostamento a destra di 1 bit divide per 2, lo spostamento a sinistra moltiplica per 1; l'operatore ^ (XOR) restituisce 1 se il bit è esattamente 1.
    Esempio, assumiamo n=10.
    [code]
    ((10>>1)<<1)^n

    Ovvero 10 /2 = 5 *2 = 10. In bit il 10 corrisponde a
    1010
    ^
    1010
    ____
    0000

    Come si vede il risultato è 0.
    Se n fosse stato 11 avrei ottenuto
    1010
    ^
    1011
    ____
    0001

    Ed ecco che il numero è dispari.

    mio dio ragazzo, ti sei complicato la vita OMG
    per sapere se un un numero è pari o dispari ti basta fare (n&1)
    quel casino che hai fatto è anche più lento del mod mi sa XD
     
    Top
    .
  13.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (lumo @ 7/2/2010, 22:20)
    mio dio ragazzo, ti sei complicato la vita OMG
    per sapere se un un numero è pari o dispari ti basta fare (n&1)
    quel casino che hai fatto è anche più lento del mod mi sa XD

    Si questo lo so :P
    Ma volevo complicarmi la vita, altrimenti non sarei io.
     
    Top
    .
  14. x-reynik-x
     
    .

    User deleted


    Però il codice di Skydrake dà True per tutti i dispari, che è sbagliato!
     
    Top
    .
  15. ~Andrey™
     
    .

    User deleted


    CITAZIONE (x-reynik-x @ 10/2/2010, 21:01)
    Però il codice di Skydrake dà True per tutti i dispari, che è sbagliato!

    CITAZIONE (~Andrey™ @ 7/2/2010, 15:22)
    PS: Il tuo "Return True" andava dopo il For, anche se sicuramente sarà stata una svista :)

     
    Top
    .
35 replies since 27/11/2009, 15:02   566 views
  Share  
.