-4

我想制作一个程序,根据用户输入的 X 长度打印所有真假排列。我所做的是首先初始化一个数组 X 元素 long 并将它们全部初始化为 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

另一种看待问题的方式(希望)可以清楚地表明您真正在做的是计数:

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 回答
0

只需使用加法来实现它,因为那是您要重新实现的。然后实现一种方法,根据每个位置的位值的值将二进制数映射为真、假值。使用 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,这可能会变得更好。对于计数中的每个二进制数,该数字的每一位都会为您提供您寻求的真/假值之一:

0 ==> 000 ==> false false false
1 ==> 001 ==> false false true
2 ==> 010 ==> false true  false
于 2013-06-10T00:00:58.707 回答
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 回答