我试图在java中找到以下代码中每个的总和。我应该在这段代码中做出哪些更改。
import java.io.IOException;
class as {
static void printSubsets(int set[]) {
int n = set.length;
for (int i = 0; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if ((i & (1 << j)) > 0) {
System.out.print(set[j] + " ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
int set[] = { 1, 2, 3 };
printSubsets(set);
}
}
上述代码的输出是:
1
2
1 2
3
1 3
2 3
1 2 3
我希望将子集的每个元素乘以其最后一个数字,例如
1*1=1
2*2=4
1*2+2*2=6
3*3=9
likewise all elements
最后生成所有这些子集1+4+6+9+..
的总和,依此类推。
上面的代码也打印空集和子集是有序的。如何编辑这个程序进行更改,使其不打印空集和打印随机子字符串。
答案 0 :(得分:1)
据我所知,你想要将所有元素相互叠加,并用结果打印出迭代的每一步。你在这里:
static void printSubsets(int set[]) {
int sum = 0;
for (int i=0; i<set.length; i++) {
for (int j=i; j<set.length; j++) {
int var = set[i] * set[j];
sum += var;
System.out.println("( " + set[i] + " * " + set[j] + " = " + var + " ) -> sum=" + sum);
}
}
System.out.println("final sum=" + sum);
}
在输入[1,2,3]
的情况下,总和应该根据我的算法增长:
1,3,6,10,16至20
关于<<
移位运算符的注释,它将位模式向左移位。假设数字2
在二进制中被理解为10
。将此数字移至2 << 4
将导致二进制100000
,以十进制形式理解为32
。我不确定你真的需要这种模式。