2016-10-12 6 views
0

У меня есть целочисленный массив (представляющий 4-значное число), который мне нужно увеличить, чтобы каждое целое число никогда не превышало 3. В принципе, ему нужно распечатать каждое четырехзначное число, которое делает не имеет 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 делает дисплей каждая цифра в массиве. Итак, как мне изменить свой код, чтобы правильно увеличить массив? И мне даже нужно использовать массив? Как я могу это сделать без этого?

+0

Ваш код не печатает никакие '4' ... вы уверены, что это ваш реальный выход? –

+1

Если вы хотите напечатать каждые 4 цифры, вам нужно будет добавить еще несколько логик. В настоящее время вы зацикливаете первую цифру, а затем вторую и т. Д., Это не будет получать номера, где первая цифра ниже второй цифры, например. –

+0

@ M.M жаль насчет '4' s, это было из предыдущей версии ... –

ответ

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; 
} 
+0

Не возражаете ли вы принять мой ответ, так как вы его скопировали? – chqrlie

+0

@chqrlie Я не копировал ваш ответ. Ваш ответ напомнил мне о чем-то, что я увидел в книге программирования C. Я нашел его там и изменил его, чтобы исправить мою проблему –

+2

my bad, имя функции и макет выглядели поразительно похожими на мой код, но на самом деле они разные. – chqrlie

-1

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

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

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

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

+0

Как это реализовать? –

2

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

#include <stdio.h> 

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; 
} 
Смежные вопросы