-
.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).. -
x-reynik-x.
User deleted
Ah ma io mi riferivo a Skydrake . -
~{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.. -
x-reynik-x.
User deleted
E un if è più dispendioso? Puoi spiegarmi il tuo codice, non ci capisco niente di VB!! . -
~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!!
Certo, non di poco.
Comunque il suo codice è semplice:CODICEx += (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].. -
~{Skydrake™}».
User deleted
CITAZIONE (~Andrey™ @ 7/2/2010, 15:00)Anche se non capisco perchè non usare Step 2 nel for
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
Comunque, come avresti intenzione di verificare se x è pari all'esterno del for (chiaramente senza utilizzare un If)?. -
~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ì:CODICEx = (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
PS: Il tuo "Return True" andava dopo il For, anche se sicuramente sarà stata una svista. -
.
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:CODICEx = ((n%2)&n)*3;
Oppure, per non usare %2CODICEx = (((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 casoCODICEx = (((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.. -
~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:CODICEFor x As UInt16 = 2 To Math.Sqrt(n)
Cioè in modo che il ciclo non venga eseguito.. -
~{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?. -
~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. -
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:CODICEx = ((n%2)&n)*3;
Oppure, per non usare %2CODICEx = (((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 casoCODICEx = (((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
. -
.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
Ma volevo complicarmi la vita, altrimenti non sarei io.. -
x-reynik-x.
User deleted
Però il codice di Skydrake dà True per tutti i dispari, che è sbagliato! . -
~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
.