【剑指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 }

 

执行结果                                   

 

posted @ 2021-01-13 15:12  月南君  阅读(91)  评论(0编辑  收藏  举报