Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Shell Root en 8 Marzo 2011, 20:58 pm



Título: Saber si un número es par
Publicado por: Shell Root en 8 Marzo 2011, 20:58 pm
Pues hoy en la clase de lógica y programación, nos pusieron un ejercicio de como saber si un número es par. Pero tenemos varias limitaciones.
1. Estamos viendo el condicional IF
2. No podemos usar la función MOD

Sí puedo hacerla fácilmente, pero usando un bucle cosa que tampoco puedo porque no hemos llegado a esa sentencia. No puedo adelantarme...

Hay algún método de calcularlo. Sabiendo qué:
(4 / 2) = (2 / 2) = 0 --> PAR

Pero si es un número por ejemplo 84, tengo que hacer muchas operaciones. Alguna idea?

Edit: Otra cosa sería dividir en número entre 2 y validar si es un número entero. Pero como sería eso en un algoritmo pseudocódigo. :S


Título: Re: Saber si un número es par
Publicado por: Edu en 8 Marzo 2011, 21:17 pm
Para saber si es un numero entero vas a tener q usar el mod, yo tambien se como hacerlo de otras formas pero no han dado bucles decis..


Título: Re: Saber si un número es par
Publicado por: Shell Root en 8 Marzo 2011, 21:21 pm
No, si pudiera usar un bucle lo haría yo mismo. Pero joder, siempre me enseñaron usando la función MOD! Ahora no puedo usarla.


Título: Re: Saber si un número es par
Publicado por: Akai en 8 Marzo 2011, 21:26 pm
Una solución bastante... <insértese algo aquí> es lo siguiente.

Si tu tienes un número representado en binario, será par si el último bit (LSB, bit de menor peso), es 0. Impar en caso contrario.

Entonces, puedes probar a usar una AND bit a bit, (En C/C++ sería el &, que no el &&) para saber si el LSB bit está a 0.


Título: Re: Saber si un número es par
Publicado por: Edu en 8 Marzo 2011, 21:27 pm
Akai, el profesor no le dejara hacer eso xD


Título: Re: Saber si un número es par
Publicado por: Edu en 8 Marzo 2011, 21:32 pm
Ya se como es, usa un tipo q no use decimales entonces haces asi mira esto en vb6 q fue lo primero q agarre a mano para mas rapido:

Código
  1.  
  2. Private Sub Command1_Click()
  3. Dim num As Integer, num2 As Integer
  4. num = CInt(Text1.Text)
  5. num2 = num / 2
  6.  
  7. If num = num2 * 2 Then
  8. MsgBox "bien"
  9. Else
  10. MsgBox "mal"
  11. End If
  12.  
  13. End Sub
  14.  


Título: Re: Saber si un número es par
Publicado por: Akai en 8 Marzo 2011, 21:34 pm
Por qué no? No puedes usar el módulo, tampoco bucles, qué otra solución tienes que recurrir a la aritmética binaria?

Bueno, Se me ocurre otra, Si divides al número entre la mitad de si mismo y da 2, es que es par. Si da diferente, es impar. Eso SIEMPRE Y CUANDO trates con enteros, debido a que en impares, se cancela el resto, y entonces tu número/2 no sería exactamente la mitad


Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Si, esa era otra xDDDDDD


Título: Re: Saber si un número es par
Publicado por: Shell Root en 8 Marzo 2011, 21:39 pm
Lo de la aritmética binaría me suena...
Y cabe decir que es un algoritmo en pseudocódigo.


Título: Re: Saber si un número es par
Publicado por: criskapunk en 10 Marzo 2011, 01:53 am
Me resultó curioso este ejercicio y encontré otra forma para hacerlo (No se me ocurría :P).

Se sabe que todo número positivo elevado a cualquier número entero da un resultado positivo. En cambio, si el número es negativo, el resultado dará positivo en caso de que el exponente sea par, y negativo si el exponente es impar. Entonces podríamos hacer lo siguiente:

Código
  1. n = int(raw_input("Ingrese un numero: "))
  2.  
  3. if (-1) ** n > 0:
  4.    print "Es par"
  5. else:
  6.    print "Es impar"

Un saludo :P



Título: Re: Saber si un número es par
Publicado por: Shell Root en 10 Marzo 2011, 02:09 am
Wooow, a ver a ver, esto es lo que necesito, pero no lo entendí. XD

Supongamos que tenemos el número "4", si lo elevamos a la -1, que daría:
Código
  1. 4 ^ (-1) = 0,25

Ahora un número como el "3", si lo elevamos a la -1, que daría:
Código
  1. 3 ^ (-1) = 0,333333333

WTF?

Edit:
Perdón es alrreves :D


Título: Re: Saber si un número es par
Publicado por: criskapunk en 10 Marzo 2011, 02:18 am
Lo estas haciendo al revés :P

El -1 lo tenés que usar como base y el número del cual querés calcular si es par o impar, como exponente.

Dado que el -1 es negativo, el signo del resultado va a depender del exponente (El número que vos ingresas). Si es par, el resultado será positivo y si es impar el resultado será negativo.

Un saludo

Edit:
jajaja :P Espero que te haya servido.



Título: Re: Saber si un número es par
Publicado por: Edu en 10 Marzo 2011, 02:46 am
Pero no te sirvio la q puse yo Shell Root? talvez es la mas simple y mas creible para los profesores..


Título: Re: Saber si un número es par
Publicado por: Shell Root en 10 Marzo 2011, 02:52 am
Pero estas usando funciones de enteros.


Título: Re: Saber si un número es par
Publicado por: Edu en 10 Marzo 2011, 03:06 am
Como? dices por el Cint(text1.text) ? eso es solo para no multiplicar un string lo convierto a su tipo corresponiente, pero porq para probarlo lo hice en un textbox sino lo haces asi:

Código
  1. bool EsPar(int num) {
  2.  
  3. int num2 = num / 2;
  4.  
  5. if (num == (num2 * 2)) return true;
  6. else return false;
  7. }
  8.  

Ya se q sabes muchisimo mas q yo pero no entiendo porq no sirve xD


Título: Re: Saber si un número es par
Publicado por: Shell Root en 10 Marzo 2011, 03:15 am
Pero es que no entiendo lo que intentas hacer, supongo que como es una variable entera, solo tomar los valor antes de la coma, es decir...

3/2 = 1,5 así que solo tomará el valor de 1, o me equivoco?


Título: Re: Saber si un número es par
Publicado por: Edu en 10 Marzo 2011, 03:20 am
Claro, otro ejemplo con el q se me ocurrio fue con 5.
num = 5
num2 = 5 / 2  pero esto no va a dar 2,5 sino q va a dar 2

y si 5 es distinto a 2 * 2 q es 4, entonces es porq 5 es impar

Pero con el numero a ver.. 84..
num = 84
num2 = 84 / 2 q es 42 entonces si q dejara el 42 ya q es entero y entra en el int

y como 42 * 2 es 84 entonces es par


Título: Re: Saber si un número es par
Publicado por: Shell Root en 10 Marzo 2011, 03:24 am
Bueno, he aquí el problema... Hacedlo en pseudocodigo. :p


Título: Re: Saber si un número es par
Publicado por: Edu en 10 Marzo 2011, 03:30 am
No se usar el pseudocodigo, no he ido a la universidad todavia pero vs sabes programacion q te esta pasando? xD lee el codigo en voz alta y lo anotas a lo q dices xD


Título: Re: Saber si un número es par
Publicado por: criskapunk en 10 Marzo 2011, 03:57 am
Usando PSeInt, así queda el código de XXX-ZERO-XXX.

Proceso ParOImpar
   Leer n;
   Si n = TRUNC(n / 2) * 2 Entonces
      Escribir "El numero es par"
   Sino
      Escribir "El numero es impar"
   FinSi
FinProceso

Tuve que usar la función TRUNC(), la cual devuelve la parte entera de la expresión entre paréntesis dado que no hay ningún operador para hacer la división entera :P

Un saludo


Título: Re: Saber si un número es par
Publicado por: Shell Root en 10 Marzo 2011, 04:17 am
A eso es lo que me refiero, no puedo usar funciones. Pero creo que pseudocodigo la división que toma la parte entera es con el operador \. Así que ahora también me funciona :D


Título: Re: Saber si un número es par
Publicado por: Edu en 10 Marzo 2011, 04:24 am
PEro si un int / int da otro int y los int no tienen decimales, por eso lo pense asi yo

edit: con eso q dices shell root convenceras mas al profesor je


Título: Re: Saber si un número es par
Publicado por: criskapunk en 10 Marzo 2011, 04:44 am
@Shell Root

Si. O también podrías utilizar div para realizar la división entera. Como yo estaba escribiendo el pseudocódigo en PSeInt tuve que usar esa función, porque no tiene ningún operador matemático para eso :P


Título: Re: Saber si un número es par
Publicado por: Akai en 10 Marzo 2011, 09:36 am
De todas formas, el pseudocódigo es por así decirlo, un lenguaje intermedio entre el lenguaje habitual (informal) y otro formal (lenguaje de programación).

Trabajar en pseudocódigo no implica que no puedas dar un tipo a las variables, o utilizar funciones, simplemente que lo que tu estás escribiendo, no está en el ámbito de formalidad de un lenguaje concreto.

(O eso tengo entendido yo)

Si tu utilizas un 5 en pseudocódigo, como diferencias si es un entero, o en cambio es un número con decimales (5.) o el caracter '5' o la cadena "5"?



Título: Re: Saber si un número es par
Publicado por: 79137913 en 11 Marzo 2011, 17:30 pm
HOLA!!!

Ejemplo bien simple en VB6:

Código
  1. Private Sub Form_Load()
  2.    For x = 0 To 100
  3.        If (x And 1) Then
  4.            Debug.Print "no_es_par " & x
  5.        Else
  6.            Debug.Print "si_es_par " & x
  7.        End If
  8.    Next
  9. End Sub

Y pseudo codigo con eso que decis de comprobar si es entera la division:
Código:
Si Entero(Numero / 2) = Numero / 2 Entonces Imprimir "Es Par"
(creo que te referias a eso)

GRACIAS POR LEER!!!


Título: Re: Saber si un número es par
Publicado por: Valkyr en 13 Marzo 2011, 01:32 am
Me resultó curioso este ejercicio y encontré otra forma para hacerlo (No se me ocurría :P).

Se sabe que todo número positivo elevado a cualquier número entero da un resultado positivo. En cambio, si el número es negativo, el resultado dará positivo en caso de que el exponente sea par, y negativo si el exponente es impar. Entonces podríamos hacer lo siguiente:

Código
  1. n = int(raw_input("Ingrese un numero: "))
  2.  
  3. if (-1) ** n > 0:
  4.    print "Es par"
  5. else:
  6.    print "Es impar"

Un saludo :P



La solución que decía criska es valida, ¿porque no la usas?, además no usas ni bucles, ni mod, ni aritmética a nivel de bit...nada de nada, solo haces una potencia. En pseudocódigo quedaría algo así (cada profesor, cada alumno, y cada persona puede usar un pseudocódigo distinto, yo te lo pongo a mi forma):

Código:
PROGRAMA
ENTERO numero;
INICIO_PROGRAMA
               LEER(numero);
               SI (-1)^numero > 0 ENTONCES
                              ESCRIBIR("El número es par");
               SI_NO
                              ESCRIBIR("El número es impar");
               FIN_SI
FIN_PROGRAMA

LEER(numero) es como si pidiese el número al usuario, y ESCRIBIR() es como si escribiese en pantalla.

Espero que te haya servido, saludos.


Título: Re: Saber si un número es par
Publicado por: mauriciodelos en 13 Marzo 2011, 07:35 am
Las respuestas que te dieron son muy buenas, pero yo me sumo a la idea de lo mas simple y entendible.

INICIO_PROGRAMA

entero NUMERO

ingresar(NUMERO)

si (NUMERO dividido 2 multiplicado por 2 es igual a NUMERO) entonces escribir( es par)
si_no escribir (es impar)

FIN_PROGRAMA

------------------------------

//Si al número impar lo dividís por 2, te va a dar un resultado con coma flotante, lo único que tenés que hacer es declarar el NUMERO como entero, para que cuando lo vuelvas a multiplicar, lo hagas solamente por la parte entera.

------------------------------

Ni siquiera tenés que usar números con coma flotante, ni mod, ni bucles ni nada, definís todo dentro del if.
Igualmente, elegí la que realmente comprendas, la que después sepas explicar y aplicar.
 ;D