【剑指offer】58.数值的整数次方

总目录:

算法之旅导航目录

 

1.问题描述

实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
数据范围:base100  ,exponent100  ,保证最终结果一定满足val104 
进阶:空间复杂度 O(1)  ,时间复杂度 O(n)

 

2.问题分析

对于Power(double base, int exponent)

1联乘法

当exponent为正时,将exponent个base联乘起来;当exponent为负时,将|exponent|个1/base联乘起来。
尤其是当base==0时返回0,exponent==0时,返回1.

2快速幂

计算幂运算,我们还可以使用快速幂计算。

规则如下,详见设计巧妙的代码:
 


3.代码实例

联乘法

 1 class Solution {
 2   public:
 3     double Power(double base, int exponent) {
 4         if (base == 0) {
 5             return 0;
 6         }
 7         if (exponent == 0) {
 8             return 1;
 9         }
10 
11         //处理负指数
12         if (exponent < 0) {
13             base = 1 / base;
14             exponent = -exponent;
15         }
16 
17         return base * Power(base, exponent - 1);
18     }
19 };

 

快速幂

 1 class Solution {
 2   public:
 3     double Pow(double x, int y) {
 4         double ret = 1;
 5         while (y) {
 6             //如果y是奇数
 7             if (y & 1) {
 8                 ret *= x;
 9             }
10 
11             //指数折半,底数平方
12             y = y >> 1;
13             x *= x;
14         }
15 
16         //更巧妙的在于ret *= x不仅联乘了中间指数为奇数时的x,且兜住了底
17         return ret;
18     }
19 
20     double Power(double base, int exponent) {
21         if (exponent < 0) {
22             base = 1 / base;
23             exponent = 0 - exponent;
24         }
25 
26         return Pow(base, exponent);
27     }
28 };

 

posted @ 2022-12-02 17:24  啊原来是这样呀  阅读(28)  评论(0)    收藏  举报