我正在尝试完成Java类的分配,在该类中,我们将创建一种用于求解幂的有效方法(以指数为基础,由用户的输入定义)。

我几乎已准备就绪,但是有效的方法pow2无法正确处理奇数指数。它使基数比预期的多一倍。我在这里想念什么?

例如,如果我输入4作为我的基础,输入5作为我的exp,程序将吐出4096而不是1024。

import java.util.Scanner;

public class MyPow {


    public static int countGbl = 0;


    public static double raise(double base, int exp) {

        double b = base;

        for (int i = 1; i < exp; i++){
            countGbl += 1;
            base = base * b;
        }

        return base;
    }


    public static double pow1(double base, int exp) {

        if (base == 0.0) return Double.POSITIVE_INFINITY;
        else if (base == 0.0 && exp >= 0) return 0.0;
        else if (exp == 1) return base;
        else if (base > 0 && exp == 0) return 1.0;
        else{
            if (exp < 0){
                base = 1.0/base;
                exp = -exp;
            }

            if (exp % 2 == 0){
                countGbl++;
                return pow1(base, exp/2) * pow1(base, exp/2);
            }
            else {
                countGbl += 2;
                return pow1(base, exp/2) * pow1(base, exp/2) * base;
            }
        }
    }


    public static double pow2(double base, int exp) {
        double temp = raise(base, exp/2);
        double retval = temp*temp;
        if (exp % 2 == 1){
            countGbl++;
            retval *= temp;
        }
        return retval;
        }





    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        System.out.println("Enter base: ");
        double base = Integer.parseInt(s.nextLine());
        System.out.println("Enter exp: ");
        int exp = Integer.parseInt(s.nextLine());

        System.out.println(pow2(base, exp));
        System.out.println(countGbl);

    }
}


仅供参考,pow1方法的原因是因为我们要编写一个效率不如pow2的示例方法。

另外,请忽略countGbl。我们的教授希望我们计算在方法调用期间完成的乘法次数。

最佳答案

您似乎正在尝试进行优化:

baseexp = baseexp / 2 * baseexp / 2 *基数

其中exp是奇数,而exp/2是Java的整数除法,实际上也是数学中的下限函数。

但是,在奇数情况下您正在执行的操作是乘以另一个系数temp,该系数已经计算为baseexp / 2。

retVal乘以base,而不是temppow2中的更改

retval *= temp;




retval *= base;


此外,另一种优化方法是在raise中将exp除以2后再返回pow2方法,您可以继续递归,重复调用pow2直到达到指数的基本情况1或0。

10-08 19:55