Recientemente me pidieron que escribiera un programa, que determina si un número es par o impar sin usar ningún operador matemático/bit a bit.Encuentra el número Par/Impar sin usar el operador matemático/bit a bit
¿Alguna idea?
Gracias!
Recientemente me pidieron que escribiera un programa, que determina si un número es par o impar sin usar ningún operador matemático/bit a bit.Encuentra el número Par/Impar sin usar el operador matemático/bit a bit
¿Alguna idea?
Gracias!
Esto se puede hacer usando un campo de 1 bit como en el siguiente código:
#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;
}
Desde que obj.a es un valor de un campo, sólo el LSB se llevará a cabo allí! Y puede verificarlo por su respuesta. 0 -> ¡Incluso de lo contrario es impar ...!
no portátil, pero espeluznantemente artístico –
Si realiza el bitfield 'unsigned' en lugar de' int', ¡se vuelve perfectamente portátil! – caf
¡sí! Gracias por señalar, hice la edición ...! – SuperSaiyan
Se puede convertir el número en una cadena y comprobar si el último dígito es 1,3,5,7 ó 9.
La rutina de conversión de cadenas probablemente usa el operador del módulo (matemático) internamente para extraer los dígitos del número. – Amnon
sí que se puede hacer! Pero es bastante ineficiente convertir eso a cadena y luego verificar –
@Amnon: los campos de un solo bit propuestos en otros lugares usan operadores bit a bit de forma interna.Es solo una cuestión de qué tan estúpido crees que es este rompecabezas de la entrevista: "muy" o "extremadamente". –
no estoy seguro de si == es considerado como un operador matemático, si no hay , a continuación, convertir el número en una cadena y prueba si el último char es igual a 0, 2, 4, 6 u 8.
Editar: == parece ser considerado como un/operador relacional operador de comparación.
switch (n) {
case 0:
case 2:
case 4:
...
return Even;
}
return Odd;
¡ja, mira lo que nunca pensamos! – jrharshath
¿Por qué está esto downvoted? –
¿Por qué los votos a favor? Sin operadores relacionales y bit a bit, no veo nada mejor. (+1) –
... ¿Por qué harías esto?
Esto solo es posible si intenta evitar escribiendo +, -, /, *, &, | ^, o%.
Los conmutadores y la conversión de cadenas tienen tablas de búsqueda implícitas y, por lo tanto, adiciones implícitas.
Los siguientes miradas para 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;
...
pero utiliza implícitas & para llegar a sólo el bit.
Este es un desafío extraño.
Puede usar el número como un desplazamiento de dirección de memoria para una instrucción de carga. Si su arquitectura requiere que el acceso a la memoria se alinee en desplazamientos de dos bytes, entonces el procesador permitirá cargas desde direcciones pares y lanzará una excepción para una dirección impar (carga desalineada).
¿Qué sucede si hay algunas direcciones pares para las que lanza una excepción (por ejemplo, valores fuera del rango de su mapa de memoria)? –
Eso queda como un ejercicio para el lector. – benzado
solución más concisa a su 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;
}
¿Qué tal un bit a bit simple o?
bool is_odd(const int &number){
return (number == (number | 1));
}
bool is_even(const int &number){
return (number != (number | 1));
}
(corregir) hmm ... Supongo que debería leer el título ¿eh?
#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");
}
#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;
}
La pregunta decía "sin usar operadores bit a bit". 'num & 1' es definitivamente un operador bit a bit. – Flexo
¿Usted está esperando que le ayudaremos con su entrevista? –