Problema de conversión de base

Estoy tratando de convertir un entero en una cadena en este momento, y estoy teniendo un problema.

He escrito el código y está funcionando en su mayor parte, pero tiene un pequeño defecto al llevarlo al siguiente lugar. Es difícil de describir, así que te daré un ejemplo. Usando la base 26 con un conjunto de caracteres que consiste en el alfabeto en minúsculas:

0 = “a”
1 = “b”
2 = “c”

25 = “z”
26 = “ba” (Esto debería ser igual a “aa”)

Parece omitir el carácter en el lugar cero en el conjunto de caracteres en ciertas situaciones.

Lo que me confunde es que no veo nada malo en mi código. He estado trabajando en esto por mucho tiempo y todavía no puedo entenderlo.

char* charset = (char*)"abcdefghijklmnopqrstuvwxyz"; int charsetLength = strlen(charset); unsigned long long num = 5678; // Some random number, it doesn't matter std::string key do { unsigned int remainder = (num % charsetLength); num /= charsetLength; key.insert(key.begin(), charset[remainder]); } while(num); 

Tengo la sensación de que la función está pasando por encima del módulo devolviendo un cero, pero he estado trabajando en esto durante tanto tiempo, no puedo entender cómo está sucediendo. Cualquier sugerencia es bienvenida.

EDITAR: El hecho de que la cadena generada sea poco endian es irrelevante para mi aplicación.

Si comprendo correctamente lo que desea (la numeración utilizada por Excel para las columnas, A, B, … Z, AA, AB, …), esta es una notación basada que puede representar números a partir de 1. Los 26 dígitos tienen valores 1, 2, … 26 y la base es 26. Así que A tiene un valor 1, un valor Z 26, un valor AA 27 … La computación de esta representación es muy similar a la representación normal que solo necesita ajustar para el desplazamiento de 1 en lugar de 0.

 #include  #include  #include  std::string base26(unsigned long v) { char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; size_t const base = sizeof(digits) - 1; char result[sizeof(unsigned long)*CHAR_BIT + 1]; char* current = result + sizeof(result); *--current = '\0'; while (v != 0) { v--; *--current = digits[v % base]; v /= base; } return current; } // for testing #include  int main(int argc, char* argv[]) { for (int i = 1; i < argc; ++i) { unsigned long value = std::strtol(argv[i], 0, 0); std::cout << value << " = " << base26(value) << '\n'; } return 0; } 

Corriendo con 1 2 26 27 52 53 676 677 702 703 da

 1 = A 2 = B 26 = Z 27 = AA 52 = AZ 53 = BA 676 = YZ 677 = ZA 702 = ZZ 703 = AAA 

Tu problema es que ‘a’ == 0.

En otras palabras, ‘aa’ no es la respuesta, porque eso es realmente 00. ‘ba’ es la respuesta correcta porque b = ‘1’, por lo que es 10 en la base 26, que es 26 en decimal.

Tu código es correcto, parece que lo estás malinterpretando.

Creo que deberías hacer a = 1 y z = 0 para tener abc … z como en el decimal 1234 … 90

Compáralo con el sistema decimal: ¡9 es seguido por 10 y no por 01!

Para obtener la solución de Aprogrammers para comstackr en mi sistema (estoy usando gcc versión 4.6.1 (Ubuntu / Linaro 4.6.1-9ubuntu3) necesitaba agregar encabezados; #include #include