多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【剑指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 };
复制代码

 

本文作者:啊原来是这样呀

本文链接:https://www.cnblogs.com/OhOfCourse/p/16945103.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(17)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起