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
有什么问题吗?或者值是否正确?
答案 0 :(得分:2)
public static int powersOf2(int k){
int x=1;
while (k > 0){
x *= 2;
k--;
}
return x;
}
答案 1 :(得分:1)
方法powersOf2完全错误。它将始终返回2的最大功率小于1000.您应该考虑输入参数并执行两次乘法运算:
public static int powersOf2(int k){
int x=1;
for (int i = 0; i < k; ++i) {
x *= 2;
}
return x;
}
答案 2 :(得分:1)
它不会总是返回512.这取决于您的初始参数。
如果您将k
作为参数传递,则返回k*2^n
小于1000且k*2^(n+1)
大于1000.(因此参数0方法将永远循环)
因此,如果你传递3,它的参数将返回768,如果你传递501和999之间的任何数字,该方法将是你的初始参数。
对于负数,该方法将输入参数乘以2,直到发生下溢,如果下溢的结果大于1000,它将返回最后一个负数,否则,它将以与a相同的逻辑继续迭代。正参数小于1000。
那么您对计划的期望是什么?
答案 3 :(得分:0)
您总是将k
乘以2直到超过1000
。因此,对于所有1000 > k > 0
,它返回512
,否则返回0.
答案 4 :(得分:0)
您的程序进入无限循环,因为当您尝试以0作为输入调用方法时。 k始终为0并且始终小于1000.您需要在程序中排除0,因为0的幂为2时没有意义
答案 5 :(得分:0)
我认为你想要处理特殊情况 - 对于0,它应该是1,对于否定,你应该把它当作负面的力量,因此你应该为你的变量使用double而不是int。这是代码:
public class Practice3 extends ConsoleProgram
{
public static double powersOf2(int k) {
double x = 0;
if(k == 0) {
return 1;
}
double answer = 2;
if(k>0){
for(int i = 0; i < k; i++) {
answer *= 2;
}
return answer;
} else {
answer = 1;
for(int i = 0; i > k; i--) {
answer /= 2;
}
return answer;
}
}
答案 6 :(得分:-2)
public static int powersOf2(int k){
int x=1;
for (i=0; i < k; i++){
x*=2;
}
return x;
}