我正在尝试完成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
,而不是temp
。 pow2
中的更改
retval *= temp;
至
retval *= base;
此外,另一种优化方法是在
raise
中将exp
除以2后再返回pow2
方法,您可以继续递归,重复调用pow2
直到达到指数的基本情况1或0。