码迷,mamicode.com
首页 > 其他好文 > 详细

刷题13 数值的整数次方

时间:2017-12-24 11:14:39      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:color   log   pow   base   ble   运算   分解   pre   复杂度   

描述:  给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

 

之前没刷过类似的题, 很明显先想到循环相乘,那就O(n)复杂度了。

有想过分解开进行乘,感觉需要什么东东来优化一下步骤。

这是一个关于快速幂的知识,其实就是将幂转换成二进制形式, 比如说对于 ab,b 等于 9, 9 的二进制是 1001 , 然后 ab 就等于 a20 * a23 ,等效变换为 (a)2 * (a22)2

所以这样就好办了, 幂转换成二进制有几位就循环几次, 复杂度降低到O(log2 n)。 然后每次循环都对基数 a 进行自乘,也就是每次循环对 a 进行平方运算。当循环到幂的二进制表示中为1的位, 将其累乘起来就好了。

初次代码实现(注意:有错):

 1 class Solution {
 2 public:
 3     double Power(double base, int exponent) {
 4         if(exponent == 0)
 5             return 1;
 6         if(base == 0)
 7             return 0;
 8         
 9         double result = 1;
10         while(e)
11         {
12             if(e & 1)
13                 result *= base;
14             base *= base;
15             e >>= 1;
16         }
17         return result; 
18     }
19 };

提交检测后发现不对啊, 想了想, 自己只考虑了幂为 0 和非 0 的情况, 但是幂为负数的情况没有考虑。

所以接下来修改为:

 1 class Solution {
 2 public:
 3     double Power(double base, int exponent) {
 4          int e = -1;
 5         if(exponent == 0)
 6             return 1;
 7         else if(exponent < 0)
 8             e = - exponent;
 9         else
10             e = exponent;
11         if(base == 0)
12             return 0;
13         
14         double result = 1;
15         while(e)
16         {
17             if(e & 1)
18                 result *= base;
19             base *= base;
20             e >>= 1;
21         }
22         return exponent < 0 ? (1 / result) : result; 
23     }
24 };

 

刷题13 数值的整数次方

标签:color   log   pow   base   ble   运算   分解   pre   复杂度   

原文地址:http://www.cnblogs.com/purehol/p/8095761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!