java有两个问题的幂
import acm.program.*;
public class Practice3 extends ConsoleProgram
{
public static int powersOf2(int k) {
int x = 0;
while (k < 1000) {
x = k;
k *= 2;
}
return x;
}
public void run()
{
println(powersOf2(1));
println(powersOf2(0));
println(powersOf2(2));
println(powersOf2(-1));
println(powersOf2(3000));
}
我认为我没有从powersOf2
中得到正确的值。当我运行程序时,只显示512。如果我按每个println
运行它,它会给我:
512
none
512
none
0
有什么不对劲吗?或者价值观是正确的
# 1 楼答案
你总是将
k
乘以2,直到它超过1000
。因此,对于所有1000 > k > 0
它返回512
,否则返回0# 2 楼答案
# 3 楼答案
它不会总是返回512。这取决于初始参数。 如果将
k
作为参数传递,它将返回小于1000的k*2^n
和大于1000的k*2^(n+1)
。(所以参数为0的方法将永远循环)因此,如果你传递3作为它的参数,它将返回768,如果你传递501到999之间的任何数字,这个方法将是你的初始参数
对于负数,该方法将输入参数乘以2,直到出现下溢,如果下溢的结果大于1000,它将返回最后一个负数,否则,它将以与小于1000的正参数相同的精确逻辑继续迭代
那么你希望你的程序做什么呢
# 4 楼答案
2的方法是完全错误的。它总是返回最大的2次方,小于1000次方。您应该考虑输入参数并执行两次乘法:
# 5 楼答案
你的程序进入无限循环,因为当你试图用0作为输入调用这个方法时。k总是0,并且总是小于1000。您需要在程序中排除0,因为用2的幂表示0是没有意义的
# 6 楼答案
我想你应该考虑特殊情况——对于0,它应该是1,对于负数,你应该把它当作负幂,因此你应该使用double而不是int作为变量。下面是代码: