一、题目
————————————————
给定一个 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); } }
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。