Увеличить массив до определенного числа

У меня есть целочисленный массив (представляющий 4-значное число), который мне нужно увеличить, чтобы каждое целое число никогда не превышало 3. В принципе, ему нужно печатать каждый 4-значный номер, который не имеет 4 или более. Вот результат, который я ожидаю по сравнению с фактическим результатом:

Expected: 0000 0001 0002 0003 0010 0011 0012 0013 0020 0021 0022 .... 3333 Received: 0000 1000 2000 3000 3100 3200 3300 3310 3320 3330 3331 3332 

Я знаю, что мой алгоритм испорчен, но я не знаю, что с ним делать:

 int i, c[4]; memset(c, 0, sizeof(c)); i = 0; while (1) { testprint(c); c[i]++; if (c[i] == 3) i++; if (i == 3) break; } 

Все testprint отображают каждую цифру в массиве. Итак, как мне изменить свой код, чтобы правильно увеличить массив? И мне даже нужно использовать массив? Как я могу это сделать без этого?

Вы можете использовать функцию для преобразования числа в его представление в базу 4 (то есть: используя только цифры 0, 1, 2 и 3):

 #include  char *itoa4(unsigned value, char *dest, int digits) { dest[digits] = '\0'; while (digits-- > 0) { dest[digits] = '0' + value % 4; value /= 4; } return dest; } int main(void) { char buf[5]; for (int i = 0; i < 256; i++) { printf("%s\n", itoa4(i, buf, 4)); } return 0; } 

Хорошо, я нашел ответ с помощью @chqrlie:

 int *ito4(int value, int dest[]) { int i = 4; while (i-- > 0) { dest[i] = value % 4; value /= 4; } return dest; } int main(void) { int i, arr[4]; for (i = 0; i < 256; i++) print_array(ito4(i, buf), 4); return 0; } 

Для этого вам не нужно использовать массив. Как вы выбираете представлять значение, а само значение – две разные вещи.

Такое же значение, например 10, может быть представлено в любой другой базе, которую вы хотите, это 10 в базе 10, 0xA в базе 16, 12 в базе 8 и так далее.

В то же время при каждом увеличении значение увеличивается на 1. Предполагая это, вы можете просто форматировать unsigned integer чтобы напечатать его как номер базы4.

Имейте в виду, что с (value >> (i*2)) & 0x3 вы извлекаете i-ю цифру, тогда все становится тривиальным.