将数组增加到一定数量

时间:2016-10-12 21:50:52

标签: c arrays

我有一个整数数组(代表一个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都会显示数组中的每个数字。那么我应该如何更改代码以正确增加数组?我甚至需要使用数组吗?没有一个我该怎么做?

3 个答案:

答案 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;
}

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

为此,您根本不需要使用数组。你如何选择代表价值和价值本身是两回事。

相同的值,例如10,可以用你想要的任何不同的基数来表示,它是基数为10的10,基数为16的0xA,基数为12 8等等。

同时,将值增加1可在每个基础下运行。假设您可以轻松地格式化unsigned integer以将其打印为base4数字。

请注意,使用(value >> (i*2)) & 0x3提取第i个数字,然后一切都变得微不足道。