¿Algoritmo alterno a itoa?

Iniciado por AlbertoBSD, 15 Mayo 2016, 00:18 AM

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

AlbertoBSD

Muy buen dia.

Tengo entre manos el siguiente problema.

Tengo en memoria un buffer que contiene números de gran longitud, puedo sumarlos, restarlos, dividirlos etc.

Ahora necesito imprimirlos en formato decimal, actualmente solo tengo forma de visualizarlos en formado hexadecimal.

ejemplo:

numero 1: 0000000000000020a7c0a09f032703
numero 2: 00000000000000000000000000000021a45141d6351f
numero 3: 00000000000000001ed31c62dfa50b
numero 4: 00000000000000000000000000000044b5f2b7695b70
numero 5: 00000000000000000040ab08571d224107
numero 6: 000000000000000000000000000000003ac807630f6218
numero 7: 00000000000000000000000072b11568f28c2a
numero 8: 000000000000000000000000000000000000607fe65ec43bdf


Numeros en Little Endian.


Lo anterior lo hago solo imprimiendo byte a byte en hexadecimal.

La pregunta aqui es.. ¿debo de busca el algoritmo ya hecho para convertir de entero a "Cadena Decimal" usado por itoa?

O recomiendan algun otro algoritmo que sea mas adecuado para números largos, repito el numero ya lo tengo en memoria y es de N cantidad de bits

El algoritmo itoa es el siguiente:

http://opensource.apple.com//source/groff/groff-10/groff/libgroff/itoa.c

y al aprecer no funciona para numeros como el que tengo.

#define INT_DIGITS 19 /* enough for 64 bit integer */

char *itoa(i)
     int i;
{
  /* Room for INT_DIGITS digits, - and '\0' */
  static char buf[INT_DIGITS + 2];
  char *p = buf + INT_DIGITS + 1; /* points to terminating '\0' */
  if (i >= 0) {
    do {
      *--p = '0' + (i % 10);
      i /= 10;
    } while (i != 0);
    return p;
  }
  else { /* i < 0 */
    do {
      *--p = '0' - (i % 10);
      i /= 10;
    } while (i != 0);
    *--p = '-';
  }
  return p;
}


Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

ivancea96

Buscas un algoritmo sin más, o uno especialmente eficiente?
Si buscas uno cualquiera, en C++ sería este uno:
Código (cpp) [Seleccionar]
string toDec(Num n){
if(n==0)
return "0";
bool isNegative = n<0;
string str;
while(n>0){
str = (n%10)+'0';
n /= 10;
}
return (isNegative?"-":"")+str;
}

AlbertoBSD

Gracias, buscaba ideas o ver si habia alguno para numeros de N bits pero al parecer tendre que hacerlo como comentas con modulos y divisiones entre 10, usando las funciones que ya tengo de modulo y división.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Stakewinner00

#3
estaba pensando que en C++ existe la funcion to_string() para pasar un decimal a string, y parece que usa vsnprintf. Igual puedes probar a hacer algo con vsnprintf para convertirlo

Olvide que si son tipos propios no se podrá hacer...


AlbertoBSD

#4
Cita de: Stakewinner00 en 15 Mayo 2016, 01:37 AM
estaba pensando que en C++ existe la funcion to_string() para pasar un decimal a string, y parece que usa vsnprintf. Igual puedes probar a hacer algo con vsnprintf para convertirlo

Olvide que si son tipos propios no se podrá hacer...


Si conozco esas funciones, snprint me ayuda mucho para depurar :)

y claro es un tipo propio, el cual describo en el post:

Números de longitud variable en C (Numeros muy grandes)

Y si voy a tomar el algoritmo existente de itoa y adaptarlo a mi tipo de dato.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW