我想知道如何打印n个1和0的组合。组合数n
是用户定义的。预期的产出是;
N = 1;
0,1
N = 2;
00,01,10,11
N = 3;
000,001,010,011,100,101,110,111
等等..等等。
输出将有2^n
个组合数(其中n是单个组合中预期数字的数量)。
如何在不使用任何内置功能的情况下执行此操作?这个问题与语言无关,适用于算法。
提前致谢... :)
答案 0 :(得分:11)
您可以枚举二进制中2^n - 1
之前的所有数字。这将给你留下相同的组合。
n = 2
枚举至2^3 - 1
= 7
转换为二进制:
000 --> 0
001 --> 1
010 --> 2
011 --> 3
100 --> 4
101 --> 5
110 --> 6
111 --> 7
编辑:修正了位数。这工作
#include <stdio.h>
#define LENGTH 3
void print_binary(int n)
{
int bit = 1<<LENGTH - 1;
while ( bit ) {
printf("%d", n & bit ? 1 : 0);
bit >>= 1;
}
printf("\n");
}
int main(){
int n = 1<<LENGTH, i;
for(i=0;i<n;i++)
print_binary(i);
}
答案 1 :(得分:3)
如果你不关心速度和记忆,那么冷使用递归会导致一个小而短的解决方案:
public static void print01PermutationsUpToLength(final String currentString, final int upTo) {
if (upTo == 0) {
System.out.println(currentString);
return;
}
print01PermutationsUpToLength(currentString + "0", upTo - 1);
print01PermutationsUpToLength(currentString + "1", upTo - 1);
}
(java。显然,这可以在允许递归和按值调用或复制String的每种语言中完成)
如果您不喜欢String
参数,可以添加一个开始函数:
public static void print01PermutationsUpToLength(final int upTo) {
print01PermutationsUpToLength("", upTo);
}
结果:
final int upToLength = 3;
print01PermutationsUpToLength(upToLength);
000
001
010
011
100
101
110
111
格式化可以根据需要进行更改,这只是为了更好地查看结果
如果切换String构造的部分(currentString + "0"
),则可以更改排序。
答案 2 :(得分:2)
void print_digit(int n,int digits)
{
int i;
for(i=0;i<digits;i++)
{
if(n&(1<<(digits-i-1)))
{
putchar('1');
}
else
{
putchar('0');
}
}
}
print all_digits(int e)
{
for(i=0;i<(1<<e);i++)
{
print_digit(i,e);
putchar('\n');
}
fflush(stdout);
}
答案 3 :(得分:0)
这是我对这个问题的看法。给出一个字符数组,你想找到使用整个数组的k组合。
为了解决这个问题,我们的数组包含:['0','1']
。
我们说我们有char set[] = new {'0','1'};
下面的方法将为您提供零和一的任意数量的组合。我用0和1的组合测试它,数据集为50个字符。
public void printLengthRec(char[] inputSet, String prefix, int k) {
int sizeOfInputArray=inputSet.length;
//TerminationCase: k is 0, print prefix
if (k == 0) {
System.out.println(prefix);
return;
}
// One by one add all characters from set and recursively
// call for k equals to k-1
for (int i = 0; i < 2; ++i) {
// Next character of input added
String newPrefix = prefix + set[i];
printLengthRec(inputSet, newPrefix, k - 1);
}
}