Autor Tema: Cómo convertir un número en letras.

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

12 Mayo, 2016, 07:54 am
Leído 1028 veces

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hace tiempo me dieron una solución pero no pude entenderla. Recientemente intenté idear una propia y aunque avancé, no he podido completarla.

Para no complicarme, las letras son por ahora sólo A y B, ninguna más. Y es lo mismo decir 0 y 1, pero puede haber 0s delante (por eso la conversión común "decimal a binario" no sirve). A continuación pongo ejemplos de cómo debe ser la conversión:
Número____Conversión
0_________0
1_________1
2_________00
3_________01
4_________10
5_________11
6_________000
13________111
etc

Este código traduce bien hasta el 5:
Código: [Seleccionar]
if (N<2) {
    NTrad = Tx.charAt(N);
} else if (N<6) {
    N1 = Math.floor(N/2)-1;
    N2 = N-(N1+1)*2;
    NTrad = Tx.charAt(N1)+Tx.charAt(N2);
}
Lo de "Tx.char..." es para convertir el 0 o 1 en A o B, pueden obviarlo. Lo demás se entiende ¿no?
Si el número a traducir es menor que 2, la traducción es igual al número.
Sino, si es menor que 5, el 1er número es (ver N1) y el 2ndo es (ver N2).
¿Cómo funciona?
No sé explicarlo bien pero, el número de delante vale doble, básicamente. un ejemplo más avanzado:
12________110
12 = (N1+1)*4 + (N2+1)*2 + N3
Puede que ayude verlo de forma inversa:
Conversión____Número
0____________0
1____________1
00___________2
Cuando hay un número delante significa que vale igual que todas las posibilidades que había sin él. Como 10 vale 0, 1, 2... 9, o sea 10 posibilidades.

Para siguientes casos (hasta cierto punto) pensé que esto serviría:
Código: [Seleccionar]
if (N<2) {
    NTrad = Tx.charAt(N);
} else if (N<6) {
    N1 = Math.floor(N/2)-1;
    N2 = N-(N1+1)*2;
    NTrad = Tx.charAt(N1)+Tx.charAt(N2);
} else if (N<14) {
    N1 = Math.floor(N/4)-1;
    NRestante = N - (N1+1)*4;
    N2 = Math.floor(NRestante/2)-1;
    N3 = NRestante-(N2+1)*2;
}
Ni siquiera lo probé, pasé directamente a otra cosa, pero me equivoqué, no sirve.
Si N es 8, el resultado debería ser 010, pero con esto resulta:
N1 = Math.floor(8/4)-1 = Math.floor(2)-1 = 2-1 = 1
Debería ser 1.

¿Cual sería entonces la fórmula de N1? Aparentemente, en vez de dividir por 4 habría que dividir entre 10, y no habría necesidad de restar 1. Y en el caso de N<66, habría que dividir entre 4 (también sin necesidad de restar 1). Ahora, claro, la pregunta: ¿Por qué esos números? Quiero saber eso porque quiero programar que se averiguen, no ponerlos yo luego de muchas pruebas.

El código que tengo (intentando una solución que sirva para cualquier caso) es este:
Código: [Seleccionar]
Escena 1
   actions for fotograma 1
      Tx = "AB";
      N = -1;
   actions for fotograma 2
      N = N+1;
      trace ("Traduciendo "+N+"...");
      NTrad = "";
   actions for fotograma 3
      if (N<2) {
         NTrad = Tx.charAt(N);
         trace (N+" es "+NTrad);
         gotoAndPlay (2);
      }
   actions for fotograma 4
      Cifras = 1;
      Numsconcifras = Math.pow(2, Cifras);
      Numshastacifras = Numsconcifras;
      NRestante = N;
   actions for fotograma 5
      Cifras = Cifras+1;
      Numsconcifras = Math.pow(2, Cifras);
      Numshastacifras = Numshastacifras+Numsconcifras;
      trace ("Cifras es "+Cifras);
      trace ("Numsconcifras es "+Numsconcifras);
      trace ("Numshastacifras es "+Numshastacifras);
   actions for fotograma 6
      if (NRestante>=Numshastacifras) {
         gotoAndPlay (5);
         trace (N+" tiene más de "+Cifras+" cifras.");
      }
   actions for fotograma 7
      trace ("Frame 7");
      trace ("NRestante es "+NRestante);
      trace ("Numsconcifras es "+Numsconcifras);
      NewNum = Math.floor(NRestante/(Numsconcifras/2))-1;
      trace ("NewNum es "+NewNum);
      NTrad = NTrad+Tx.charAt(NewNum);
      NRestante = NRestante-(NewNum+1)*(Numsconcifras/2);
      trace ("NRestante es "+NRestante);
      if (NRestante<2) {
         NTrad = NTrad+Tx.charAt(NRestante);
         trace (N+" es "+NTrad);
         gotoAndPlay (2);
      }
   actions for fotograma 8
      Numsconcifras = Numsconcifras/2;
      gotoAndPlay (7);
No es importante en este tema, sólo digo que mi idea era dividir entre Numsconcifras/2, o sea 2, 4, 8, etc. No 4, 10 y no sé qué otros números, que no entiendo bien de dónde saldrían.
¿Por qué 4 y 10? ¿y cual es el próximo y sucesivamente?

Gracias.

12 Mayo, 2016, 12:05 pm
Respuesta #1

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 47,123
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola
 
 Por favor: no repitas la misma pregunta en distintos hilos.

 Si todavía no te queda claro lo que te explican, vuelve a preguntar en el mismo hilo.

 Este tema fue tratado y respondido aquí:

http://rinconmatematico.com/foros/index.php?topic=85935.msg344547#msg344547

Saludos.

12 Mayo, 2016, 11:41 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Es otro enfoque con otras dudas, hice un tema nuevo para que quedara más claro, sino verían el 1er mensaje sin saber que luego hice otra cosa, sería confuso.
Igual puedo poner un edit al principio ¿no? Eso no lo había pensado.