我一直在涂鸦这段小代码,它应该计算并打印出哪些2的幂被总结成一个给定的数字。它可以很好地处理小的奇数,但当我想要它计算偶数或更大的数字时,它就会丢失。
我甚至不知道我可以尝试什么,代码看起来不错,但我可能总是没有注意到。
System.out.println("Give a number");
int gigaInt = si.nextInt();
String gigaBit = Integer.toBinaryString(gigaInt);
String[] gigaBitArray = gigaBit.split("");
System.out.println("Binary: " + gigaBit);
List<Integer> powers = new ArrayList<Integer>();
for(int counter = gigaBitArray.length-1; counter >= 0; counter--){
if (gigaBitArray[counter].equals("1"))
powers.add((int)Math.pow(2,counter));
else if(gigaBitArray[counter].equals("0")){
powers.add(0);
}
}
System.out.println("Powers: " + powers);所以,很明显,程序应该计算功率,它确实是这样做的!在某些情况下...在这里,当给定9时
给出一个数字9二进制: 1001幂: 8,0,0,1
但是当我想要它计算一个偶数时,它总是显示"1“作为唯一的组成部分,如下所示:
给出一个数字8二进制: 1000次方: 0,0,0,1
每当被要求处理一个大数字时,它就会变得完全疯狂:
给出一个数542Binary: 1000011110幂: 0,256,128,64,32,0,0,0,0,1
对于这方面的任何建议,我都会非常感激。这可能只是一种幼稚的错误,所以请一定要指出。
发布于 2019-10-16 05:13:45
根据Dawood ibn Kareem的评论,您首先测试的是低位比特。如果你想先列出高阶幂,你需要一个索引变量和一个幂变量。而且,不需要检查"0“。如果不是"1“,那么它一定是"0”。
int iIndex;
int iLength = gigaBitArray.length;
int iPower = iLength - 1;
for ( iIndex = 0; iIndex < iLength; ++iIndex, --iPower )
{
if ( gigaBitArray[iIndex].equals("1") )
{
powers.add((int)Math.pow(2, iPower));
}
else
{
powers.add(0);
}
}发布于 2019-10-16 05:14:59
您的代码的问题在于您正在查看的数组索引。当你输入数字8时,它的二进制表示是1000。当你把它拆分成一个数组时,你会得到:
索引:0 1 2 3值:1 0 0 0
因为您是从列表的末尾开始,所以索引0将在最后处理(并且将与2^0相同)。
要解决这个问题,您只需颠倒正在查看的元素的顺序,同时保持for循环的顺序不变。例如:代替:
gigaBitArray[counter]它应该是:
gigaBitArray[gigaBitArray.length -1 - counter]发布于 2019-10-16 05:27:58
除了上面的两个答案外,您还可以通过将0s和1s相乘来消除if else:
int len = gigaBitArray.length;
for (int i = 0; i < gigaBitArray.length; i++) {
powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));
}https://stackoverflow.com/questions/58402569
复制相似问题