Этот код работает с положительными числами:
#include <stdio.h>
#include <stdlib.h>
static void itov(char vigesimalStr[], int n);
int main(void)
{
int tests[] = { 30, 0, 1, 19, 20, 21, 399, 400, 401, 379341, };
enum { NUM_TESTS = sizeof(tests) / sizeof(tests[0]) };
printf("Hello world!\n");
for (int i = 0; i < NUM_TESTS; i++)
{
char result[32];
itov(result, tests[i]);
printf("%6d = %5s base 20\n", tests[i], result);
}
return 0;
}
static void itov(char vigesimalStr[], int n)
{
char base_digits[20] =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
};
int index = 0;
int base = 20;
do
{
vigesimalStr[index++] = base_digits[n % base];
n = n / base;
} while (n != 0);
vigesimalStr[index--] = '\0';
for (int i = 0; i < index; i++, index--)
{
char t = vigesimalStr[i];
vigesimalStr[i] = vigesimalStr[index];
vigesimalStr[index] = t;
}
}
Выходные данные:
Hello world!
30 = 1A base 20
0 = 0 base 20
1 = 1 base 20
19 = J base 20
20 = 10 base 20
21 = 11 base 20
399 = JJ base 20
400 = 100 base 20
401 = 101 base 20
379341 = 27871 base 20
Обратите внимание, что функция преобразования не выполняет печать - это делает ее более широко используемой,Интерфейс функции не предоставляет механизма, гарантирующего отсутствие переполнения целевой строки;пользователь должен предоставить достаточно большую строку для хранения результата.
Обработка отрицательных чисел сложнее - вполне выполнимо, но сложнее, потому что в обычных системах с двумя дополнениями нельзя отрицать INT_MIN
и получите положительное значение.Вы можете отрицать любое положительное значение, а затем обработать его.