Ваш вопрос можно разделить на две части:
- конвертирует целое число в его представление в произвольной базе,
n
и
- учитывая
n
символов, выведите изображение выше.
Вторая часть, очевидно, очень проста. Если у вас есть представление числа в заданной базе и символов, которые вы хотите использовать в такой базе, то их распечатка - это просто печать вещей в цикле.
Чтобы получить целочисленное представление в данной базе, мы будем использовать массив int
s, со значениями, представляющими цифры, и индексами, представляющими места. Нам также нужно хранить количество действительных цифр. Кроме того, мы предполагаем, что имеем дело только с положительными числами, поскольку это то, что вы, похоже, предлагаете в своем вопросе.
#define MAX 128 /* maximum number of digits in the final representation */
/* abstract representation of a number in a given base.
`n` is the number of valid digits in the representation, and
`digits` stores the digits in reverse order */
struct rep {
int digits[MAX]; /* change as needed, or dynamically allocate */
size_t n;
};
Тогда давайте напишем функцию для преобразования числа в его представление. Поскольку проще вернуть обратное представление, мы вернем его и затем напечатаем в обратном порядке:
/* convert a number `n` to its (reversed) representation in base `base`,
and return the result in `ret`. */
void convert(int n, size_t base, struct rep *ret)
{
size_t i = 0;
do {
ret->digits[i++] = n % base;
n /= base;
} while (n > 0 && i < MAX);
ret->n = i;
}
Сделав это, давайте напишем функцию для вывода представления:
/* return a string representation of `num` in base `ndigits`, with `digits`
representing the symbols */
char *next(const char *digits, size_t ndigits, int num)
{
struct rep r;
static char ret[MAX+1];
size_t i;
convert(num, ndigits, &r);
if (r.n == MAX)
return NULL;
for (i=r.n; i; --i)
ret[r.n-i] = digits[r.digits[i-1]];
ret[r.n-i] = 0;
return ret;
}
Затем мы можем написать нашу программу драйвера:
int main(void)
{
const char digits[] = {'x','y','z'};
size_t ndigits = sizeof digits / sizeof digits[0];
int i;
for (i=0; i < 100; i++) {
char *data = next(digits, ndigits, i);
if (data)
printf("%s\n", data);
else
fprintf(stderr, "%d, error converting\n", i);
}
return 0;
}
Я написал convert
и next
выше, чтобы они не зависели друг от друга (кроме очевидного упрощения, что я использую обратные представления). Это позволяет легко использовать их в других программах.