-4

ユーザーが入力した X の長さに基づいて、true と false のすべての順列を出力するプログラムを作成したいと考えています。私がしたことは、最初に配列 X 要素の長さを初期化し、それらをすべて true に初期化することでした。次に、それらを循環させて、さまざまな順列を作成します。出力はすべて true の配列で、false を出力し、残りを true に出力します。

If X (length was 2)

true  true
false true
false true
false true

これが私のコードです。

import hsa.Console;

public class TorF {

public static void main (String[] args) {

    Console c = new Console();

    c.print("Length: ");
    int l = c.readInt();

    boolean[] values = new boolean[l];

    for (int i = 0; i < values.length; i++) {

        values[i] = true;
    }

    int numberOfPremutations = (int) Math.pow (2, l);

    for (int j = 0 ; j < numberOfPremutations ; j++) {

        for (int i = 0 ; i < l ; i++)
            System.out.print (values [i]);

        System.out.println ("");

        values[l - 1] = false;

        for (int i = l - 1 ; i > 0 ; i--) {

            if (values [i] == false) { 
                values [i - 1] = false;
                values [i] = true;


            }
        }

    }       

}

}
4

4 に答える 4

0

いくつかの条件で失敗する可能性がありますが、これはブール変数の組み合わせを出力することがわかったソルンです。

package function;

public class PrintngAllCombinationOfTrueFalse {
    public static void printCombination(int num) {
        int permuteLen=(int) Math.pow(2,num);
        boolean b[]=new boolean[num];
        for(int i=0;i<b.length;i++)
            b[i]=true;

        for(int j=0;j<permuteLen;j++){
            for( int i=0;i<num;i++)
                System.out.print("  "+b[i]+"  ");
            System.out.println(" ");

            for(int i=num-1;i>=0;i--){
                if(b[i]==true ){
                    b[i]=false;
                    break;
                }
                else
                    b[i]=true;
            }
        }
    }
    public static void main(String g[]){
        printCombination(3);
    }
}
于 2016-03-30T05:20:37.280 に答える
0

それが再実装するものであるため、追加を使用して実装するだけです。次に、各位置のビット値の値に基づいて、2 進数を真または偽の値にマップする方法を実装します。long を使用すると、長さが 63 (符号付き数値) に制限されます。それ以上のものが必要な場合は、BigInteger を使用してください (もちろん、宿題は読者に残されています)。

for( long i = 0; i < permutations; i++ ) {
    printBinary( i, l );
}

public void printBinary( long number, int length ) {
    long current = 1 << length;
    while( current > 0 ) {
        System.out.print( number & current == current ? "true " : "false " );
        current >>> 1;
    }
}
于 2013-06-09T23:53:03.990 に答える
0

さあ、みんな、かわいそうな男に休憩を与えましょう。

あなたが書きたかったことは、次のようなものだったと思います。

for (int i = l - 1; i >= 0; i--)
    System.out.print(values[i]);

System.out.println();

for (int i = 0 ; i < l ; i++) {
    if (values[i] == false) {
        values[i] = true;
        break;
    } else {
        values[i] = false;
    }
}

これは、ここで行っていることは本質的には単にカウントしているだけ、つまり0、1、2、3 などであることに注意することで、さらに改善される可能性があります。カウント内の各 2 進数について、その数値の各ビットは、求める真/偽の値の 1 つを提供します。

0 ==> 000 ==> false false false
1 ==> 001 ==> false false true
2 ==> 010 ==> false true  false
于 2013-06-10T00:00:58.707 に答える
0

問題を別の方法で見ると、(できれば) 実際に行っていることはカウントであることを明確にすることができます。

for (BigInteger i = BigInteger.ZERO ; ! i.testBit(length) ; i = i.add(BigInteger.ONE)) {
    for (int j = length - 1 ; j >= 0 ; j--) {
        System.out.print( Boolean.valueOf( i.testBit(j) ).toString());
    }
    System.out.println();
}

このアプローチには、非常に長い長さでも機能するという利点があります。

于 2013-06-10T00:21:36.157 に答える