В качестве альтернативы обращению массива используется рекурсия.
Поскольку число цифр в некотором целочисленном типе никогда не бывает таким большим, рекурсия не будет чрезмерной.
Ниже приведено значение do {} while
цикл, чтобы избежать особого случая с printBase(0)
.
Он также использует отрицательные значения в printBase_helper()
, где /,%
хорошо определено с C99.Это позволяет избежать неопределенного поведения кода, например n = -n
, когда n == INT_MIN
.
void printBase_helper(int neg, int base) {
if (neg <= -base) {
printBase_helper(neg / base, base);
neg %= base;
}
putchar("0123456789ABCDEFGHIJKLMONOPQSTUVWXYZ"[-neg]);
}
void printBase(int n, int base) {
if (n < 0) {
putchar('-');
} else {
n = -n;
}
printBase_helper(n, base);
}
Тестовый код
int main(void) {
int value[] = {0, 1, -1, 10, INT_MAX, INT_MIN};
int base[] = {10, 2, 36};
for (unsigned v = 0; v < sizeof value / sizeof value[0]; v++) {
for (unsigned b = 0; b < sizeof base / sizeof base[0]; b++) {
printf("Base %2d, value %11d, --> base %2d, value ", 10, value[v], base[b]);
printBase(value[v], base[b]);
printf("\n");
}
}
return 0;
}
Вывод
Base 10, value 0, --> base 10, value 0
Base 10, value 0, --> base 2, value 0
Base 10, value 0, --> base 36, value 0
Base 10, value 1, --> base 10, value 1
Base 10, value 1, --> base 2, value 1
Base 10, value 1, --> base 36, value 1
Base 10, value -1, --> base 10, value -1
Base 10, value -1, --> base 2, value -1
Base 10, value -1, --> base 36, value -1
Base 10, value 10, --> base 10, value 10
Base 10, value 10, --> base 2, value 1010
Base 10, value 10, --> base 36, value A
Base 10, value 2147483647, --> base 10, value 2147483647
Base 10, value 2147483647, --> base 2, value 1111111111111111111111111111111
Base 10, value 2147483647, --> base 36, value ZIK0ZJ
Base 10, value -2147483648, --> base 10, value -2147483648
Base 10, value -2147483648, --> base 2, value -10000000000000000000000000000000
Base 10, value -2147483648, --> base 36, value -ZIK0ZK