创建一个数组,使其包含二进制的0到N的元素

时间:2013-01-03 14:07:34

标签: c++ c algorithm data-structures

我需要一个快速算法,它会将二进制中给定数量N的所有可能数字生成一个数组。

e.g N=3
Then the array should be {0,0,0},{0,0,1}.....{1,1,1}
N<=17. 

到目前为止,我已尝试过这种方法,这是一种递归解决方案。

void print_digits(int n, std::string const& prefix = "") {
    if (!n) {
        printf("%s,",prefix.c_str());
        return;
    }
    print_digits(n-1, prefix + '0');
    print_digits(n-1, prefix + '1');
}

我需要一个更好的算法。

3 个答案:

答案 0 :(得分:3)

C ++中的所有整数都作为二进制表示直接存储在内存中。因此,如果您只想存储N个数字,您应该直接将它们直接写入数组“原样”

std::vector<unsigned> Numbers;
// if N is length of the number, calculate the maximum as 2^N - 1
long long Max = 1 << N - 1;
for (unsinged i = 0; i < Max; ++i)
    Numbers.push_back(i);

如果你想用二进制表示法编写它们,它也非常简单,即使你想自己编写代码也是如此。 (请原谅,因为这只是一个简单的示例实现

void PrintAsBits(unsigned value) {
    for (int i = sizeof(unsigned) * 8 - 1; i >= 0; --i)
        cout << ((1 << i) & value) ? 1 : 0;
    cout << '\n';
}

答案 1 :(得分:0)

以防万一有人关心,下面的代码实现了原始规范,它要求一种方法来填充二维数组,其中每个值都表示为一个数字数组,其元素对应于其值的二进制数字,大-endian order。

#include <iostream>

static const int DIGIT_COUNT = 10;

static const int VALUE_COUNT = 1 << DIGIT_COUNT;
unsigned char g_binarray[VALUE_COUNT][DIGIT_COUNT];

void Populate() {
    for(int i=0; i<VALUE_COUNT; ++i) {
        unsigned char (&curr)[DIGIT_COUNT] = g_binarray[i];
        for(int di=0; di<DIGIT_COUNT; ++di) {
            curr[di] = unsigned char((i >> (DIGIT_COUNT - 1 - di)) & 1);
        }
    }
}

void DumpArray() {
    static const char *digits = "01";
    for(int i=1; i<VALUE_COUNT; ++i) {
        for(int di=0; di<DIGIT_COUNT; ++di) {
            std::cout << digits[!!g_binarray[i][di]];
        }
        std::cout << "    " << i << std::endl;
    }
}

int main(int argc, char* argv[]) {
    Populate();
    DumpArray();
    return 0;
}

答案 2 :(得分:-1)

正如我在一篇文章中所写:

示例:如果需要长度为4,则必须有2 ^ 4 = 16个不同的数组。

您可以使用这个简单的Java代码生成所有数组:

for (int i=0; i < 16; i++) {
        System.out.println(Integer.toBinaryString(i));
}

输出:

  

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111