有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (6) 个答案

  1. # 1 楼答案

    你总是将k乘以2,直到它超过1000。因此,对于所有1000 > k > 0它返回512,否则返回0

  2. # 2 楼答案

    public static int powersOf2(int k){
            int x=1;
    
    
            while (k > 0){
                x *= 2; 
                k--;                   
            }
    
            return x;   
        }
    
  3. # 3 楼答案

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

    因此,如果你传递3作为它的参数,它将返回768,如果你传递501到999之间的任何数字,这个方法将是你的初始参数

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

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

  4. # 4 楼答案

    2的方法是完全错误的。它总是返回最大的2次方,小于1000次方。您应该考虑输入参数并执行两次乘法:

    public static int powersOf2(int k){
        int x=1;
        for (int i = 0; i < k; ++i) {
          x *= 2;
        }        
        return x;   
    }
    
  5. # 5 楼答案

    你的程序进入无限循环,因为当你试图用0作为输入调用这个方法时。k总是0,并且总是小于1000。您需要在程序中排除0,因为用2的幂表示0是没有意义的

  6. # 6 楼答案

    我想你应该考虑特殊情况——对于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;
            }
        }