Проблема может быть сведена к запуску M-di git, числа base-N с самым низким значением для начальной итерации, и увеличению его для последующих итераций.
M-di * Число 1018 * может быть представлено в виде массива (с индексом от 0 до M-1) с одним элементом на di git. Один конец массива будет содержать самый низкий порядок («самый правый») di git, а другой конец массива будет содержать самый высокий порядок («самый левый») di git. На самом деле не имеет значения, какой конец выбран для удержания самого высокого порядка di git, поэтому давайте выберем элемент 0 для удержания самого высокого порядка di git. Для общности давайте используем значения di git от 0 до N-1. (На самом деле не имеет значения, что исходная задача имеет цифры, идущие от 1 до N, поскольку легко отобразить значения di git из одной схемы в другую.)
Мы можем определить функцию для установки число M-di git до его наименьшего значения:
void num_init(unsigned int *digits, unsigned int m)
{
while (m--)
{
digits[m] = 0;
}
}
Мы можем определить другую функцию, чтобы увеличить число M-di git и указать, было ли число обернуто к его наименьшему значению :
int num_inc(unsigned int *digits, unsigned int n, unsigned int m)
{
while (m--)
{
if (digits[m] < n - 1)
{
digits[m]++;
return 0;
}
digits[m] = 0; // carry
}
return 1;
}
Пример использования:
// Print all M-digit numbers with digits from 1 to N.
void list_nums(unsigned int m, unsigned int n)
{
unsigned int digits[m];
int wrapped = 0;
num_init(digits, m);
while (!wrapped)
{
unsigned int i;
// output an m-digit number
for (i = 0; i < m; i++)
{
// Note: Add 1 to each digit so digits run from 1 to n instead of 0 to n-1.
printf("%u", digits[i] + 1);
}
// get next number
wrapped = num_inc(digits, n, m);
if (!wrapped)
{
printf(",");
}
}
printf("\n");
}
Примечание. Вывод list_nums(m, n)
будет странным, если n
больше 9.