2009-12-26 3 views

Répondre

35

Cela peut être fait en utilisant un champ de 1 peu comme dans le code ci-dessous:

#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; 
} 

Depuis obj.a est une valeur d'un champ, seul bit de poids faible sera tenu là! Et vous pouvez vérifier cela pour votre réponse .. 0 -> Même sinon Odd .. !!

+2

non-portable, mais artistique effrayant –

+7

Si vous faites le champ de bits 'unsigned' au lieu de' int', il devient parfaitement portable! – caf

+0

oui! Merci pour le pointage, j'ai fait l'édition ..! – SuperSaiyan

5

Vous pouvez convertir le nombre en une chaîne et vérifier si le dernier chiffre est 1,3,5,7 ou 9.

+0

La routine de conversion de chaîne utilise probablement l'opérateur de module (mathématique) en interne pour extraire les chiffres du nombre. – Amnon

+0

oui cela peut être fait! Mais il est tout à fait inefficace de convertir cela en chaîne, puis de vérifier –

+4

@Amnon: les champs à un seul bit proposés ailleurs utilisent des opérateurs bit à l'interne.C'est juste une question de comment stupide vous pensez que ce puzzle d'entrevue est: «très» ou «extrêmement». –

2

Je ne suis pas sûr si == est considéré comme un opérateur mathématique, si aucune , puis convertir le nombre en une chaîne et tester si le dernier char est égal à 0, 2, 4, 6 ou 8.

Modifier: == semble être considéré comme un opérateur de comparaison/opérateur relationnel.

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

ha, regardez ce que nous n'avons jamais pensé! – jrharshath

+0

Pourquoi est-ce downvoted? –

+0

Pourquoi les downvotes? Sans les opérateurs relationnels et au niveau des bits, je ne vois rien de mieux. (+1) –

1

... Pourquoi le feriez-vous?

Ceci n'est possible que si vous essayez d'éviter écriture +, -, /, *, &, | ^, ou%. Les commutateurs et la conversion de chaînes ont des tables de recherche implicites, et donc des ajouts implicites.

Les regards suivants pour l'éviter:

//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; 
... 

Mais il utilise implicitement & pour obtenir juste le bit.

1

Ceci est un défi étrange.

Vous pouvez utiliser le numéro comme décalage d'adresse mémoire pour une instruction de chargement. Si votre architecture nécessite que l'accès mémoire soit aligné sur des décalages de deux octets, le processeur autorisera les charges provenant d'adresses paires et lancera une exception pour une adresse impaire (charge non alignée).

+0

Que se passe-t-il s'il existe des adresses paires? par exemple, les valeurs hors de la portée de sa carte mémoire)? –

+0

Cela reste comme un exercice pour le lecteur. – benzado

14

solution la plus concise à votre problème:

#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

Que diriez-vous d'un simple ou binaire?

bool is_odd(const int &number){ 
return (number == (number | 1)); 
} 
bool is_even(const int &number){ 
return (number != (number | 1)); 
} 

(edit) hmm ... Je suppose que je devrais lire le titre hein?

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 question dit "sans utiliser d'opérateurs au niveau du bit". 'num & 1' est certainement un opérateur au niveau du bit. – Flexo

Questions connexes