6

1と0の組み合わせをn個印刷するにはどうすればよいですか。組み合わせの数は、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

4 に答える 4

13

2^n - 12進数になるまですべての数値を列挙することができます。それはあなたに同じ組み合わせを残すでしょう。

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);
}
于 2013-01-31T18:24:56.860 に答える
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、start関数を追加できます。

public static void print01PermutationsUpToLength(final int upTo) {
    print01PermutationsUpToLength("", upTo);
}

結果:

final int upToLength = 3;
print01PermutationsUpToLength(upToLength);
000
001
010
011
100
101
110
111

フォーマットは必要に応じて変更できます。これは、結果をよりよく表示するためだけのものです。
文字列構造のパーツを切り替えると、順序を変更できます(currentString + "0")。

于 2013-01-31T21:29:58.313 に答える
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);
}
于 2013-01-31T18:42:44.267 に答える
0

これがこの問題に対する私の見解です。文字の配列が与えられ、配列全体を使用してそのkの組み合わせを見つけたいとします。この質問に対処するために、配列には次のものが含まれています['0','1']

私たちが持っているとしましょうchar set[] = new {'0','1'};

以下の方法では、0と1の任意の数の組み合わせが得られます。50文字のデータセットで0と1の組み合わせでテストしています。

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); 
    }
} 
于 2016-04-09T15:50:44.773 に答える