2009-12-26 6 views

risposta

35

Questo può essere fatto utilizzando un campo di 1 po 'come nel seguente codice:

#include<iostream> 

struct OddEven{ 
    unsigned a : 1; 
}; 
int main(){ 
    int num; 
    std::cout<<"Enter the number: "; 
    std::cin>>num; 
    OddEven obj; 
    obj.a = num; 
    if (obj.a==0) 
     cout<<"Even!"; 
    else 
     cout<<"Odd!"; 
    return 0; 
} 

Da quel obj.a è un valore di un campo, solo LSB si terrà lì! E puoi controllare quello per la tua risposta .. 0 -> Anche diversamente Odd .. !!

+2

non portatile, ma raccapricciante artistico –

+7

Se si effettua il bitfield 'unsigned' invece di' int', diventa perfettamente portatile! – caf

+0

si! Grazie per la segnalazione, ho fatto l'edizione ..! – SuperSaiyan

5

Si potrebbe convertire il numero in una stringa e verificare se l'ultima cifra è 1,3,5,7 o 9

+0

La routine di conversione delle stringhe utilizza probabilmente l'operatore del modulo (matematico) internamente per estrarre le cifre del numero. – Amnon

+0

sì, si può fare! Ma è molto inefficiente convertirlo in stringa e quindi controllare –

+4

@Amnon: i campi a bit singolo proposti altrove utilizzano internamente operatori bit a bit.È solo una questione di quanto stupido pensi che questo puzzle di intervista sia: "molto" o "estremamente". –

2

io non sono sicuro se == è considerato come un operatore matematico, se non , quindi convertire il numero in una stringa e verificare se l'ultimo carattere è uguale a 0, 2, 4, 6 o 8.

Modifica: == sembra essere considerato come operatore di confronto/operatore relazionale.

6
switch (n) { 
    case 0: 
    case 2: 
    case 4: 
    ... 
     return Even; 
} 
return Odd; 
+0

ha, guarda cosa non avremmo mai pensato! – jrharshath

+0

Perché è down down? –

+0

Perché i downvotes? Senza operatori relazionali e bit a bit non vedo nulla di meglio. (+1) –

1

... Perché dovresti farlo?

Questo è possibile solo se si sta cercando di evitare la scrittura +, -, /, *, &, | ^, o%.

Gli switch e la conversione di stringhe hanno tabelle di ricerca implicite e quindi aggiunte implicite.

I seguenti sguardi per evitarlo:

//C/C++ code (psuedo'd up) 
struct BitNum 
{ 
    unsigned int num : 1; 
}; 

... 
BitNum a; 
a.num = number_to_be_tested; 
if(a.num == 0) return EVEN; 

return ODD; 
... 

ma utilizza implicite & per arrivare ad appena il bit.

1

Questa è una sfida strana.

È possibile utilizzare il numero come offset dell'indirizzo di memoria per un'istruzione di caricamento. Se la tua architettura richiede che l'accesso alla memoria sia allineato su offset a due byte, il processore consentirà carichi da indirizzi pari e genererà un'eccezione per un indirizzo dispari (carico non allineato).

+0

Cosa succede se ci sono alcuni indirizzi pari che genera un'eccezione per (per esempio, valori al di fuori dell'intervallo della sua mappa di memoria)? –

+0

Rimane un esercizio per il lettore. – benzado

14

soluzione più concisa al tuo problema:

#include <iostream> 
#include <string> 
#include <bitset> 

int main() { 
    std::string const type[] = {"even", "odd"}; 
    int n; 
    std::cout << "Enter an integer." << std::endl; 
    std::cin >> n; 
    std::cout << type[(std::bitset<1>(std::abs(n))[0])] << std::endl; 
} 
0

Come su un semplice OR bit a bit?

(modifica) hmm ... Suppongo che dovrei leggere il titolo eh?

0
#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int num; 
    scanf("%d",&num); 

    if(fmod(num,2)) 
    { 
     printf("number is odd"); 
    } 
    else 
     printf("number is even"); 
} 
0
#include<stdio.h> 
int main() 
{ 
    int num,res; 
    printf("\nEnter the number="); 
    scanf("%d",&num); 
    res=num&1; 
    if(res==0) 
    printf("Number is even"); 
    else 
    printf("Number is odd"); 
    return 0; 
} 
+3

La domanda diceva "senza utilizzare operatori bit a bit". 'num & 1' è sicuramente un operatore bit a bit. – Flexo

Problemi correlati