PDA

Visualizza la versione completa : [C] Pari o dispari


pikkoloma
30-10-2005, 10:06
ciao a tutti..innanzitutto mi scuso per questa idiotissima domanda ma sono nuovo sia di linguaggio sia di questa parte di forum...

1.come si fa con un IF a dire se un numero pari o dispari?
sbagliato:


if(num%2)
printf("pari");
else
printf("dispari");

?
il mio compilatore no mi riconosce l'operatore % modulo..help..

2.e con un ciclo for stampare una sequenza di numeri pari nell'intervallo 1~99?

grazie e vi prego non mandatemi a quel paese :P

oregon
30-10-2005, 10:41
int x;

for(x=1; x<100; x++)
if(x & 1)
printf("%d e' dispari\n", x);
else
printf("%d e' pari\n", x);


Prendi spunto per il tuo problema ...

pikkoloma
30-10-2005, 11:04
grazie oregon, ma vorrei anche capirlo il programma...

cosa vuol dire if(x & 1)
?

Ilmalcom
30-10-2005, 11:37
Originariamente inviato da oregon


int x;

for(x=1; x<100; x++)
if(x & 1)
printf("%d e' dispari\n", x);
else
printf("%d e' pari\n", x);


Prendi spunto per il tuo problema ...
Seeeee va beh, dai :) Che soluzioni vai a dargli?



if (n % 2)
printf ("Dispari\n");
else
printf ("Pari\n");

n % 2 = 1 sse n dispari, quindi il contrario di quello che faceva l'autore del thread

unomichisiada
30-10-2005, 12:54
Originariamente inviato da oregon


int x;

for(x=1; x<100; x++)
if(x & 1)
printf("%d e' dispari\n", x);
else
printf("%d e' pari\n", x);


Prendi spunto per il tuo problema ...
Un p macchinosa in effetti... :dott:

anx721
30-10-2005, 13:51
D anche la mia versione :)



void pariDispari(int n){
if(n == 0)
printf("pari");
else if(n == 1)
printf("dispari");
else pariDispari(n - 2);
}

alka
30-10-2005, 14:48
Originariamente inviato da unomichisiada
Un p macchinosa in effetti... :dott:
Macchinosa? E' pi macchinoso fare una divisione e controllarne il resto rispetto al verificare semplicemente lo stato del bit di peso minore del valore di riferimento, che se non ho capito male quanto fa la soluzione di oregon. :stordita:

Ciao! :ciauz:

maiosyet_2
30-10-2005, 18:11
Originariamente inviato da alka
Macchinosa? E' pi macchinoso fare una divisione e controllarne il resto rispetto al verificare semplicemente lo stato del bit di peso minore del valore di riferimento, che se non ho capito male quanto fa la soluzione di oregon. :stordita:

In realt no :fagiano:



maiosyet@alcibiade:/tmp$ time ./divisione.bin > /dev/null

real 0m38.154s
user 0m37.553s
sys 0m0.009s

maiosyet@alcibiade:/tmp$ time ./oregon.bin > /dev/null

real 0m38.646s
user 0m38.037s
sys 0m0.016s


Calcolo dei primi 100 milioni di numeri pari/dispari.

Comunque non ho mica capito cos' che fa il codice di oregon, eh :stordita:

oregon
30-10-2005, 18:46
Originariamente inviato da IImalcom
va beh, dai Che soluzioni vai a dargli?


Perche' ? E' una tra le soluzioni classiche piu' efficienti ...

Quindi? Che vuoi dire?


Originariamente inviato da unomichisiada
Un p macchinosa in effetti...


"Macchinosa" ...?

Ovviamente non sono d'accordo ...

In che senso una operazione logica AND tra bit e' piu' macchinosa del calcolo del resto di una divisione ?

Capire o meno cio' che si scrive e' una cosa, dare indicazioni come quella tua, credo vadano "giustificate" ...



Originariamente inviato da maiosyet_2
In realt no ...

Come hai fatto quei benchmark e come si dovrebbero leggere ?

Un AND tra bit sicuramente meno "pesante" del calcolo del resto di una divisione. Ti ricordo che, per confrontare dei tempi di esecuzione bisogna tenere in considerazione il "codice generato" (quello in linguaggio macchina) nei due casi ...

Codice che tu non hai mostrato ...



Originariamente inviato da maiosyet_2
Comunque non ho mica capito cos' che fa il codice di oregon, eh



Originariamente inviato da piccoloma
cosa vuol dire if(x & 1)


E' una semplice operazione di AND bit per bit tra il valore che vuoi testare e il valore 1. Come potrai facilmente immaginare, una operazione di AND di questo genere ha come risultato il valore del primo bit a destra (il bit meno significativo). In binario, quel bit indica se un valore intero e' dispari (il bit a 1) o pari (il bit a 0). Tutto qui. Se avete altri dubbi ... ne parliamo, ma e' un metodo semplicissimo e, dal punto di vista della CPU, molto piu' semplice del calcolo del resto della divisione per due.

Saluti a tutti

anx721
30-10-2005, 18:54
si ma una divisione per due sicuramente ottimizzata..bsata fare uno shift....non una normale divisione

Loading