0和1的数组组合

用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)这是所需的算法。 谢谢

从基数2的0开始计数

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

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

它是2 ^ (NUMBER_OF_COLUMNS)

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

您想知道您需要多少行。

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

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

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

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

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

 class BinarySequenceList extends AbstractList { 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 seq = new BinarySequenceList(5); for ( String s : seq ) { System.out.println(s); } //prints: 00000 00001... 
 #include "stdafx.h" #include  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> cols; int maxrows = pow(2, cols); int **parrbin = new int*[maxrows]; for (int i=0; i(cols)]; for (int row=0; row