一、题目
————————————————
给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。
————————————————
二、思路
————————————————
这道题很容易实现,但需要注意以下陷阱:1)0的负数次方不存在;2)0的0次方没有数学意义;3)要考虑exponent为负数的情况。所以可以对exponent进行分类讨论,在对base是否为0进行讨论。
下面的讨论中 x 代表 base,n 代表 exponent。
因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。
————————————————
三、解决问题
————————————————
测试用例
指数和底数都分别设置为正负数和0.
————————————————
package swordoffer;
/**
* @author LQ
* @version 1.0
* @date 2020-03-20 14:26
*/
/**
*
* 题目描述:数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
*/
public class Solution15 {
public static void main(String[] args) {
Solution15 demo = new Solution15();
System.out.println("==============================");
demo.test1();
System.out.println("==============================");
demo.test2();
System.out.println("==============================");
demo.test3();
System.out.println("==============================");
demo.test4();
System.out.println("==============================");
demo.test5();
System.out.println("==============================");
demo.test6();
System.out.println("==============================");
demo.test7();
System.out.println("==============================");
}
/**
* 因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半
* 因此整个算法的时间复杂度为 O(logN)。
* @param base
* @param exponent
* @return
*/
public double Power(double base, int exponent) {
//1)0的负数次方不存在;2)0的0次方没有数学意义;
if(0 == base){
if(exponent < 0){
System.out.println("0的负数次方不存在");
}
if(0 == exponent){
System.out.println("0的0次方没有数学意义");
}
return 0;
}
if(0 == exponent){
return 1;
}
if(1 == exponent){
return base;
}
boolean isNegative = false;
if(exponent < 0){
exponent = -exponent;
isNegative = true;
}
double pow = Power(base * base,exponent / 2);
if(exponent % 2 != 0){
pow = pow * base;
}
return isNegative ? 1 / pow : pow;
}
// ========测试代码========
void test(String testName, double base, int exponent, double expected) {
if (testName != null)
System.out.print(testName + ":");
if (Power(base, exponent) == expected) {
System.out.println("passed.");
} else {
System.out.println("failed.");
}
}
void test1() {
test("test1", 0, 6, 0);
}
void test2() {
test("test2", 0, -6, 0);
}
void test3() {
test("test3", 0, 0, 0);
}
void test4() {
test("test4", 2, 6, 64);
}
void test5() {
test("test5", 2, -3, 0.125);
}
void test6() {
test("test6", 5, 0, 1);
}
void test7() {
test("test7", -2, 6, 64);
}
}
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。

京公网安备 11010502036488号