【剑指offer】12 数值的整数次方
题目地址:数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。
题目示例
输入:
2,3
返回值:
8.00000
解法分析
看到题目第一个想到的方法就是用Math.pow(base,exponent)或者base**exponent…但是做题肯定不能用现成的轮子,用最简单的就是用循环实现,见算法1。
但是这种方法效率太低,时间复杂度为 O(N),我们可以考虑使用快速幂的办法解决问题。
快速幂的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算,时间复杂度为 O(logN),效率高不少,见算法2。
代码
算法1:
1 function Power(base, exponent) 2 { 3 // write code here 4 var n = 1; 5 if(base == 0){ 6 return 0; 7 }else if(exponent == 0){ 8 return 1; 9 }else if(exponent > 0){ 10 while(exponent--){ 11 n *= base; 12 } 13 return n; 14 }else if(exponent < 0){ 15 while(exponent++){ 16 n *= base; 17 } 18 return 1/n; 19 } 20 }
算法2:
1 function Power(base, exponent) 2 { 3 // write code here 4 if(base == 0){ 5 return 0; 6 }else if(exponent == 0){ 7 return 1; 8 }else if(exponent < 0){ 9 base = 1 / base; 10 exponent = -exponent; 11 } 12 var n = base; 13 var res = 1; 14 while(exponent){ 15 if(exponent & 1){ 16 res *= n; 17 } 18 n *= n; 19 exponent >>= 1; 20 } 21 return res; 22 }
执行结果