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