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