用于生成0和0的所有可能组合的算法。 1s,任意长度的数字

时间:2013-01-31 18:23:12

标签: algorithm

我想知道如何打印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是单个组合中预期数字的数量)。

如何在不使用任何内置功能的情况下执行此操作?这个问题与语言无关,适用于算法。

提前致谢... :)

4 个答案:

答案 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); 
    }
}