【问题标题】:Increment array to a certain number将数组递增到某个数字
【发布时间】:2016-10-12 21:50:51
【问题描述】:

我有一个整数数组(代表一个 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 的...您确定这是您的真实输出吗?
  • 如果您想打印每 4 位数字,您将需要包含更多逻辑。目前,您循环第一位数字,然后循环第二位等,例如,这不会得到第一位数字低于第二位数字的数字。
  • @M.M 很抱歉 4s,它来自以前的版本...

标签: c arrays


【解决方案1】:

您可以使用函数将数字转换为以 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;
}

【讨论】:

    【解决方案2】:

    好的,我在@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;
    }
    

    【讨论】:

    • 既然你复制了我的回答,你介意接受吗?
    • @chqrlie 我没有复制你的答案。你的回答让我想起了我在一本 C 编程书中看到的东西。我在那里找到了它并对其进行了修改以解决我的问题
    • 我的错,函数名称和布局看起来与我的代码惊人地相似,但它们确实不同。
    • @chqrlie OP 真的可以接受自己对自己问题的回答吗?
    • @WeatherVane ...是吗?
    【解决方案3】:

    您根本不需要为此目的使用数组。你如何选择表示一个值和这个值本身是两件不同的事情。

    相同的值,例如 10,可以用任何不同的基数表示,基数为 10 的 10,基数为 16 的 0xA,基数为 812 等等。

    p>

    同时将一个值加 1 在每个基数下都有效。假设这一点,您可以轻松地格式化 unsigned integer 以将其打印为 base4 数字。

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

    【讨论】:

    • 我该如何实现这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多