-2

指定された数値 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');
}

より良いアルゴリズムが必要です。

4

3 に答える 3

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';
}
于 2013-01-03T14:25:35.677 に答える
0

念のため、次のコードは元の仕様を実装しています。これは、各値がその値の 2 進数に対応する要素を持つ数値配列としてビッグ エンディアン順で表される 2 次元配列を生成する方法を要求します。 .

#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;
}
于 2013-01-03T17:05:32.280 に答える
-1

私が1つの投稿で書いたように:

例:長さが4である必要がある場合は、2 ^ 4=16の異なる配列が必要です。

この単純なJavaコードを使用して、すべての配列を生成できます。

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

これの出力:

0 1 10 11100101110111 1000 1001 1010 1011 1100 1101 1110 1111

于 2013-01-16T13:17:32.863 に答える