Autor Tema: Pasar 2 valores a uno y viceversa

0 Usuarios y 1 Visitante están viendo este tema.

12 Septiembre, 2007, 10:48 pm
Leído 3803 veces

efar

  • $$\Large \color{red}\pi$$
  • Mensajes: 3
  • Karma: +0/-0
Hola, tengo un pequeño problema con el cual he estado teniendo algunas dificultades, por lo cual quería ver si aquí me podían ayudar, bien se los explico continuación:

Tenemos 2 números enteros positivos.
El primero tiene un rango de 0 a 2 (0,1,2).
El segundo de 0 a 32975120916456501

Quería saber la forma de representarlos los dos valores en uno solo y posteriormente devolverlos a su forma original, me dijeron que si era posible y me pusieron un ejemplo con trigonometría para un triángulo rectángulo de la siguiente forma:

a = cateto opuesto
b = cateto adyacente
c = Hipotenusa

a= cualquier número del segundo rango.
b= cualquier número del primer rango.
Tan α = a/b
Seria el número resultante
a y b los dos números de los rangos de arriba

Sen α y Cos α serían las funciones que me regresaran los valores iniciales, el problema de esto es que estas funciones me dan valores con punto decimal y yo los ocupo en enteros, si redondeáramos los valores resultantes en ocasiones perderíamos decimales y por tanto el número resultante seria distinto al inicial.

Gracias por su tiempo, y espero me puedan ayudar.

13 Septiembre, 2007, 02:15 am
Respuesta #1

almendra

  • Lathi
  • Mensajes: 607
  • Karma: +0/-0
  • Sexo: Femenino
Hola

En ese  ejemplo que señalas, (el del triángulo) tal como  está escrito,   hay un problema y es que  solamente con Seno y Coseno  NO se  recuperan los valores iniciales. Esto es facil de ver, ya que el Seno y el Coseno sólo toman valores entre 1 y -1 y   tus números son enteros.

Se me ocurre esto:   si llamamos  \( a \)  al primer número (el que está entre 0 y 2)  y \( b \) al otro, entonces:   

\( 10 \cdot b + a    \) es una combinación de los dos números que te permite recuperarlos  haciendo una division por 10.       



13 Septiembre, 2007, 08:39 am
Respuesta #2

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 47,555
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola

 En general dados dos números enteros positivos:

 n entre 0 y N-1.

 m entre 0 y M-1.

 La forma más "barata" de compactarlos en uno sólo es:

\(  A=n\cdot M+m \)   (o intercambiando los papeles de m y n).

 Se recuperan como:

 n=PARTE ENTERA(A/M)

 m=A-PARTE ENTERA(A/M)*n

 Con más barata me refiero a que A tome valores lo más bajos posibles.

 Aplícalo a tu caso.

Saludos.

P.D. Por supuesto el método de almendra es también perfectamente válido.

13 Septiembre, 2007, 09:39 pm
Respuesta #3

efar

  • $$\Large \color{red}\pi$$
  • Mensajes: 3
  • Karma: +0/-0
En verdad agradezco su ayuda, hasta ahora e puesto en practica la primera respuesta (la que propuso almendra) y me a funcionado bien para los valores que he probado, también pienso probar la segunda respuesta (que hizo el favor de proponer el_manco) para ver como funcionan ambas de nuevo les agradezco el tiempo que se tomaron para responder a mi problema.

13 Septiembre, 2007, 10:11 pm
Respuesta #4

efar

  • $$\Large \color{red}\pi$$
  • Mensajes: 3
  • Karma: +0/-0
Ambas respuestas están muy bien pero en las 2 el valor se incrementa demasiado, lo que yo ocupo es que el valor resultante sea menor o no mayor que el segundo numero, en caso de que fuera mayor, que su valor no se duplicara ejemplo:

Utilizando la primera respuesta 
a =2
b =234

Nos lo siguiente 2342, el valor de este numero es mucho mayor al anterior y lo que ocupo es que no sobre pase tanto el valor del anterior o que si lo sobre pasa sea mínimo.

Utilizando la segunda respuesta nos regresa un valor exageradamente mayor al los anteriores.

Gracias por su colaboración, espero que con esto puedan proporcionar una respuesta mas adecuada al problema.

13 Septiembre, 2007, 11:30 pm
Respuesta #5

topo23

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 938
  • Karma: +0/-0
Podrias 'concatenar' los dos numeros usando decimales...
a=2
b=234 => 234.2

y para obtener los numeros originales
a = frac(234.2) * 10 = 0.2 * 10 = 2
b = ent(234.2) = 234

En esencia es el mismo metodo que sugirio Almendra pero dividiendo entre 10.

Si no puedes usar decimales entonces creo que no lo vas a poder hacer porque necesitas como minimo 3 * 32975120916456502 numeros distintos que es mas del doble. 
.

27 Mayo, 2008, 09:49 pm
Respuesta #6

aguperezpala

  • $$\Large \color{red}\pi$$
  • Mensajes: 3
  • Karma: +0/-0
  • Sexo: Masculino
buenas... yo tengo el mismo problema (o practicamente el mismo)...
efar si encontraste alguna solucion avisame porfavor...
gracias de nuevo

27 Mayo, 2008, 10:36 pm
Respuesta #7

Jabato

  • Visitante
Vamos a ver haciendo un análisis un poco más detallado del problema podemos estimar lo siguiente, la cantidad de información que debes almacenar es la que corresponde a una cadena de dígitos formada por la concatenación de los dígitos del primer número con los dígitos del segundo número. Lo mires por donde lo mires si aceptamos que el primer número tiene 3 dígitos y el segundo tiene 10 dígitos, necesitas almacenar 13 dígitos, en la forma que mejor te parezca, pero siempre son 13 dígitos en total.

Ahora bién ¿que cantidad de información, medida en bits, necesitas para almacenar un dígito? Traduce un número de 1 dígito a codigo binario y verás que necesitas al menos 4 bits ya que el 9 en código binario es 1001. Por lo tanto necesitas almacenar información correspondiente a 4 x 13 = 52 bits, lo mires por donde lo mires, aunque en función de los márgenes y condiciones que tengan que cumplir los números iniciales es posible en algunos casos reducir esa cantidad de información, por ejemplo, si no todos los dígitos son posibles, si alguno de los números es multiplo de otro etc, ¿podías ser un poco más concreto al respecto? ¿Podías explicar en que forma se generan los dos números iniciales?

Saludos, Jabato.

27 Mayo, 2008, 11:07 pm
Respuesta #8

Don Equis

  • Aprendiendo de a poco...
  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,060
  • Karma: +0/-0
  • Sexo: Masculino
  • e^{i\pi}+1=0
¿Con las respuestas de Almendra o topo23 no tendríamos problemas si ambos número son mayores que 10?

Por ejemplo, el 121 lo puedo obtener como \( 12\times{}10 + 1 \) ó \( 11\times{}10 + 11 \) :S Claro que cambiando el 10 por otro valor resolveríamos el problema. Tendríamos, ahí, el enunciado de el_manco.

Yo creo que el de el_manco que es una especie de algoritmo de división es el mejor método. Tenemos que conocer M, pero tal M, quizá, lo podamos usar para todos los casos.
I believe a leaf of grass is no less than the journey-work of the stars.

 \( e^{i\pi}+1=0 \)