0和1的数组组合

时间:2010-08-23 16:35:00

标签: c algorithm

用0和1组合填充数组的好算法是什么。 例如,如果我有三列,则组合将是: (1 1 1) (0 1 1) (1 0 1) (0 0 1) (1 1 0) (0 1 0) (1 0 0) (0 0 0) 它总共有8行(我希望我就在这里)。 那么如何提前确定所需的行数(取决于N个列数),然后如何以编程方式填充数组?任何编程语言都很好(我因为熟悉而标记了C和lisp)这是所需的算法。感谢

7 个答案:

答案 0 :(得分:11)

从基数2的0开始计数

0 = 000
1 = 001
2 = 010
...
7 = 111

答案 1 :(得分:5)

组合的数量仅为N的幂(或C中的1 << N)。这些值只是数字0到N-1的二进制表示。

答案 2 :(得分:1)

这是2 ^ (NUMBER_OF_COLUMNS)

答案 3 :(得分:1)

这只是一组子集的数量。您有3列,每列为0或1.

您想知道您需要多少行。

你有N列。让每列成为一个项目。此列有两种可能的选择,之后每列有两种选择。由于每列有N列和2个选项,因此您有2 ^ N个子集。

答案 4 :(得分:1)

#include "stdafx.h"
#include <cmath>

void converttobin(const int row, const int cols, int** parrbin)
{
    int j = cols;
    int val = row;
    while (val){
        parrbin[row][--j] = val % 2;
        val /= 2;
    }
    for (int i=0; i<j; i++)
        parrbin[row][i] = 0;
}

void testfun()
{
double cols;
cout << "Number of columns - ";
cin >> cols;
int maxrows = pow(2, cols);
int **parrbin = new int*[maxrows];
for (int i=0; i<maxrows; i++)
    parrbin[i] = new int[static_cast<int>(cols)];

for (int row=0; row<maxrows; row++)
{
    converttobin(row, cols, parrbin);
    cout << row << ": ";
    for (int i=0; i<cols; i++)
        cout << parrbin[row][i] << '\t';
    cout << endl;
}

for (int i=0; i<maxrows; i++)
    delete [] parrbin[i];

delete [] parrbin;
}

答案 5 :(得分:1)

这是填写数组的另一种方法:

for (unsigned i = 0; i < nRows; ++i) {
        for (unsigned j = i, k = nCols-1; j != 0; j >>= 1, --k)
            bin[i][k] = j & 1;
}

只记得将数组初始化为零。

答案 6 :(得分:1)

@polygenelubricants的评论是正确的。在这种情况下实际填充数组是不必要的浪费。如果你需要一个集合,这里有一个非常简单的List接口实现,可以做你想要的:

class BinarySequenceList extends AbstractList<String> {
    private final int digits;
    public BinarySequenceList(int digits) {
        if ( digits >= 32 || digits <= 0 ) { throw new IllegalArgumentException(); }
        this.digits = digits;
    }

    public String get(int index) {
        if ( index < 0 || index >= size() ) {
            throw new IndexOutOfBoundsException();
        }
        String padded = "00000000000000000000000000000000" + 
            Integer.toBinaryString(index);
        return padded.substring(padded.length() - digits);
    }

    public int size() { return 1 << digits; }
}

//usage:
List<String> seq = new BinarySequenceList(5);
for ( String s : seq ) {
    System.out.println(s);
}

//prints:
00000
00001...