Ver Mensaje Individual
  #10 (permalink)  
Antiguo 07/04/2015, 01:34
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Función decimal -> binario

Cita:
Iniciado por lareto Ver Mensaje
Yo no pude reproducir el problema, pero de todos modos encuentro que hay un par de comparaciones que piden problemas:
Código:
while(x > (pow(2, potencia)))
Código:
if(x < (pow(2, potencia)))
x es un int, mientras que pow() devuelve un double (cuando los dos parámetros con los que se invoca son int); y no está bien comparar variables de tipo real con tipos enteros así como así.

Vale la pena imprimirse para leer en las próximas vacaciones:
https://www.topcoder.com/community/d...als-section-1/
(abajo en esa página hay un link a la section 2, no pasárselo)
La verdad es que yo tampoco he sido capaz de que me salgan 9s. Uso C++Builder 6.
Si quieres algo mas potente puedes usar unsigned int64 que en mi caso me permite llegar hasta el 1048575U (0xFFFFF) que es 11111111111111111111 sin desbordarse.
La version que usa un unsigned int solo puede llegar hasta 1023U (0x3FF) que es 1111111111.
O sea que el int64 permite trabajar con binarios el doble de grandes.

Aqui el código:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <math.h>
  4.  
  5. //Prototipo de funcion
  6. uint64_t DecimalToBinary64(int x, int *overflow);
  7. int DecimalToBinary32(int x, int *overflow);
  8. int ObtainLimitBinForInt32(void);
  9. int ObtainLimitBinForInt64(void);
  10. int ObtainMaxDigitsBinInt32(void);
  11. int ObtainMaxDigitsBinInt64(void);
  12.  
  13. int main()
  14. {
  15.    int i, error;
  16.    uint64_t binario;
  17.  
  18.    int numMax = ObtainLimitBinForInt64();
  19.    int maxLenBin = ObtainMaxDigitsBinInt64();
  20.  
  21.    for(i=0; i <= numMax; i++){
  22.       binario = DecimalToBinary64(i, &error);
  23.       if(error == 1)
  24.          printf("Se desbordo el valor maximo posible para un entero binario.\n");
  25.       else
  26.          printf("%6d = %.*I64u\n", i, maxLenBin, binario);
  27.    }
  28.    getchar();
  29.    return 0;
  30. }
  31. //---------------------------------------------------------------------------
  32.  
  33. //nos devuelve un entero binario de hasta 10 digitos
  34. int DecimalToBinary32(int x, int *overflow)
  35. {
  36.    int binary=0;
  37.    int digito;
  38.    int exponente = 1;
  39.    int binMax;
  40.    int producto;
  41.    int valueMax;
  42.  
  43.    valueMax = ObtainLimitBinForInt32();
  44.  
  45.    if(x > (int)valueMax){
  46.       *overflow=1;
  47.    }else
  48.    {
  49.       *overflow = 0;
  50.       //ALGORITME
  51.       exponente=1;
  52.  
  53.       do{
  54.          //Obtenemos el valor del digito a escribir(0 ó 1)
  55.          digito = x % 2;
  56.          //Dividimos el numero por 2 para seguir
  57.          x /= 2;
  58.          //Añadimos el nuevo digito al numero binario
  59.          binary += digito * exponente;
  60.          //Aumentamos el exponente el exponente
  61.          exponente *= 10;
  62.       }while (x > 0);
  63.    }
  64.    return binary;
  65. }
  66. //---------------------------------------------------------------------------
  67.  
  68. int ObtainLimitBinForInt32(void)
  69. {
  70.    int contador=0;
  71.    int binMax=1;
  72.    int producto;
  73.    int exponente=1;
  74.    int valueMax=0;
  75.  
  76.    //Obtengo el numero de digitos maximo para el tipo
  77.    contador = ObtainMaxDigitsBinInt32();
  78.  
  79.    //Obtengo el valor binario maximo para el tipo
  80.    contador--;
  81.    while(contador > 0){
  82.       binMax *= 10;
  83.       binMax += 1;
  84.       contador--;
  85.    }
  86.  
  87.    //Paso el valor binario maximo a decimal para obtener el decimal maximo permitido
  88.     while(binMax>0)
  89.     {
  90.         producto=0;
  91.         producto=exponente*(binMax%10);
  92.         valueMax+=producto;
  93.         exponente*=2;
  94.         binMax/=10;
  95.     }
  96.    return valueMax;
  97. }
  98. //---------------------------------------------------------------------------
  99.  
  100. int ObtainMaxDigitsBinInt32(void)
  101. {
  102.    //Obtengo el numero de digitos maximo para el tipo
  103.    int contador=0;
  104.    unsigned int valueMax=0;
  105.    valueMax--;
  106.  
  107.    //Cuento los digitos binarios
  108.    while(valueMax > 0){
  109.       valueMax /= 10;
  110.       contador++;
  111.    }
  112.    return contador;
  113. }
  114. //---------------------------------------------------------------------------
  115.  
  116. int ObtainMaxDigitsBinInt64(void)
  117. {
  118.    //Obtengo el numero de digitos maximo para el tipo
  119.    int contador=0;
  120.    uint64_t valueMax=0;
  121.    valueMax--;
  122.  
  123.    //Cuento los digitos binarios
  124.    while(valueMax > 0){
  125.       valueMax /= 10;
  126.       contador++;
  127.    }
  128.    return contador;
  129. }
  130. //---------------------------------------------------------------------------
  131.  
  132. int ObtainLimitBinForInt64(void)
  133. {
  134.    int contador=0;
  135.    uint64_t binMax=1;
  136.    int producto;
  137.    int exponente=1;
  138.    uint64_t valueMax=0;
  139.  
  140.    contador = ObtainMaxDigitsBinInt64();
  141.  
  142.    //Obtengo el valor binario maximo para el tipo
  143.    contador--;
  144.    while(contador > 0){
  145.       binMax *= 10;
  146.       binMax += 1;
  147.       contador--;
  148.    }
  149.  
  150.    //Paso el valor binario maximo a decimal para obtener el decimal maximo permitido
  151.     while(binMax>0)
  152.     {
  153.         producto=0;
  154.         producto=exponente*(binMax%10);
  155.         valueMax+=producto;
  156.         exponente*=2;
  157.         binMax/=10;
  158.     }
  159.    return valueMax;
  160. }
  161. //---------------------------------------------------------------------------
  162.  
  163. //nos devuelve un entero binario de hasta 19 digitos
  164. uint64_t DecimalToBinary64(int x, int *overflow)
  165. {
  166.    uint64_t binary=0;
  167.    int digito;
  168.    uint64_t exponente = 1;
  169.    uint64_t binMax;
  170.    int producto;
  171.    uint64_t valueMax;
  172.  
  173.    valueMax = ObtainLimitBinForInt64();
  174.  
  175.    if(x > valueMax){
  176.       *overflow=1;
  177.    }else
  178.    {
  179.       *overflow = 0;
  180.       //ALGORITME
  181.       exponente=1;
  182.  
  183.       do{
  184.          //Obtenemos el valor del digito a escribir(0 ó 1)
  185.          digito = x % 2;
  186.          //Dividimos el numero por 2 para seguir
  187.          x /= 2;
  188.          //Añadimos el nuevo digito al numero binario
  189.          binary += digito * exponente;
  190.          //Aumentamos el exponente el exponente
  191.          exponente *= 10;
  192.       }while (x > 0);
  193.    }
  194.    return binary;
  195. }
  196. //---------------------------------------------------------------------------