题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
链接:https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00
思路:指数为负数时,输出的结果是base的倒数。但是base为0时,0是没有倒数的。此时可以选择抛出异常。
package offer;
import java.util.Scanner;
/*
* 1.底数为0,指数<0,输入异常
* 会出现对0求倒数的情况,需进行错误处理,设置一个全局变量;
* 2.base是否等于1
* 由于base是double型,不能直接用==判断
* 3.优化求幂函数
* 当e为偶数时,b^e=b^(e/2)*b^(e/2)
* 当e为奇数时,b^e=b^[(e-1)/2]*b^[(e-1)/2]*b
* 酱时间复杂度为O(logn)
* */
public class Solution16 {
boolean invalidInput = false;
public double Power(double base, int exponent) {
if (equal(base, 0.0) && exponent < 0) {
invalidInput = true;
return 0.0;
}
int absexponent = exponent;
if (exponent < 0)
absexponent = -exponent;
double res = getPower(base, absexponent);
if (exponent < 0)
res = 1.0 / res;
return res;
}
public double getPower(double b, int e) {
if (e == 0)
return 1.0;
if (e == 1)
return b;
double result = getPower(b, e >> 1); // 右移运算符代替了/
result *= result;
// 也算递归停止条件
if ((e & 1) == 1) // 位于运算符代替了%,表示若e为奇数,再乘以一个底数
result *= b;
return result;
}
private boolean equal(double num1, double num2) {
if (num1 - num2 > -0.0000001 && num1 - num2 < 0.0000001)
return true;
return false;
}
/*
* public static void main(String[] args) { Scanner scanner = new
* Scanner(System.in); Solution16 sl = new Solution16();
*
* System.out.print("请输入底数base:"); double base = scanner.nextDouble();
*
* System.out.print("请输入指数exponent:"); int exponent = scanner.nextInt();
*
* // double result1 = sl.Power(base, exponent); double result2 = sl.Power(base,
* exponent); // System.out.println("算法1中base的exponent次方为:" + result1);
* System.out.println("算法1中base的exponent次方为:" + result2); }
*/
}
注意递归的用法啊!!