2

我正在尝试编写一个算法来打印给定数字集的幂集。我用一个循环从我的集合的 0 到 2^length 做到了这一点。我将索引 i 转换为二进制,只要有一个,我就打印那个数字。但是,由于字符串前面没有任何零,我没有得到正确的输出。

例如,如果我有一组三个数字:{2, 3, 4},当 i 为 3 时,我希望字符串为“011”,但它是“11”,我得到的输出为2, 3 而不是 3, 4。

这是我的代码:

public static void powerset (int[] A){
        double powerSetLength = Math.pow(2, A.length);
        for (int i=0; i<powerSetLength; i++){
            String bin = Integer.toBinaryString(i);
            System.out.println ("\nbin: " + bin);
            for (int j=0; j<bin.length(); j++){
                if (bin.charAt(j)=='1')
                    System.out.print(A[j] + " ");
            }
        }
        System.out.println();
    }

这是我得到的输出:

9 7 2 

bin: 0

bin: 1
9 
bin: 10
9 
bin: 11
9 7 
bin: 100
9 
bin: 101
9 2 
bin: 110
9 7 
bin: 111
9 7 2 

这是我想获得的输出示例:

9 7 2
bin 001
2

我想知道是否有办法将整数转换为具有指定位数的二进制,以便获得此输出。

4

2 回答 2

1

处理此问题的一种简单方法是假设如果表示中缺少数字,则其值为零。你可以这样做:

// The number of digits you want is A.length
for (int j=0; j < A.length ; j++) {
    // If j is above length, it's the same as if bin[j] were zero
    if (j < b.length() && bin.charAt(j)=='1')
        System.out.print(A[j] + " ");
    }
}

当然,如果您可以假设A.length < 64(如果您希望程序在一年内完成打印,您应该能够假设)您可以使用long来表示您的数字,并使用位操作来检查是否设置了位:

int len = A.length;
for (long mask = 0 ; mask != (1L << len) ; mask++) {
    for (int i = 0 ; i != len ; i++) {
        if ((mask & (1L << i)) != 0) {
            System.out.print(A[j] + " ");
        }
    }
    System.out.print();
}
于 2013-09-16T00:07:19.517 回答
0
 String padded = String.format("%03d", somenumber);

或者

 System.out.printf("%03d", somenumber);

将每个填充到三个数字(格式说明符中的 3)。您还可以根据需要的长度以编程方式构建说明符:

 String.format("%0" + n + "d", somenumber)

但是,如果您只需要知道是否设置了位 N,则这是不必要的。你可以很容易地做到这一点:

if ((value & (1L << n)) != 0) { } 

其中 value 是数字,n 是您想要的位的序数。这在逻辑上与值相关的位 - 如果已设置,则结果为非零,并且 if 为真。如果未设置,则结果为零,if 为假。

于 2013-09-16T00:06:29.933 回答