拥有2个问题的权力

时间:2013-09-27 09:15:31

标签: 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

有什么问题吗?或者值是否正确?

7 个答案:

答案 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;   
}