-3
    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。如果我按 each 运行它println,它会给我:

512
none
512
none
0

有什么不对?或价值观是正确的?

4

7 回答 7

2
public static int powersOf2(int k){
        int x=1;


        while (k > 0){
            x *= 2; 
            k--;                   
        }

        return x;   
    }
于 2013-09-27T09:31:13.800 回答
1

它不会总是返回 512。这取决于您的初始参数。如果k作为参数传递,则返回k*2^n小于 1000 和k*2^(n+1)大于 1000 的值。(因此参数为 0 的方法将永远循环)

因此,如果您传递 3 作为其参数,它将返回 768,如果您传递 501 到 999 之间的任何数字,则该方法将是您的初始参数。

对于负数,该方法将输入参数乘以 2,直到发生下溢,如果下溢的结果大于 1000,它将返回最后一个负数,否则,它将以与正参数相同的精确逻辑继续迭代超过1000。

那么你希望你的程序做什么呢?

于 2013-09-27T09:31:13.070 回答
1

powersOf2 方法是完全错误的。它总是返回小于 1000 的 2 的最大幂。您应该考虑输入参数并执行尽可能多的乘以 2:

public static int powersOf2(int k){
    int x=1;
    for (int i = 0; i < k; ++i) {
      x *= 2;
    }        
    return x;   
}
于 2013-09-27T09:18:17.857 回答
0

Your program goes into infinite loop because when you try to call the method with 0 as input. k is always 0 and it is always less than 1000. You need to exclude 0 in your program because it does not make sense having powers of 2 for 0

于 2013-09-27T09:22:14.750 回答
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;
        }
    }
于 2013-09-27T09:53:29.947 回答
0

你总是乘以k2 直到超过1000. 因此,对于1000 > k > 0它返回的所有内容512,否则返回 0。

于 2013-09-27T09:19:37.100 回答
-2
public static int powersOf2(int k){
    int x=1;
    for (i=0; i < k; i++){
        x*=2;
    }
    return x;   
}
于 2013-09-27T09:23:03.130 回答