刷题13 数值的整数次方
2018-01-23 14:17
218 查看
描述: 给定一个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的位, 将其累乘起来就好了。
初次代码实现(注意:有错):
class Solution {
public:
double Power(double base, int exponent) {
if(exponent == 0)
return 1;
if(base == 0)
return 0;
double result = 1;
while(e)
{
if(e & 1)
result *= base;
base *= base;
e >>= 1;
}
return result;
}
};
提交检测后发现不对啊, 想了想, 自己只考虑了幂为 0 和非 0 的情况, 但是幂为负数的情况没有考虑。
所以接下来修改为:
class Solution {
public:
double Power(double base, int exponent) {
int e = -1;
if(exponent == 0)
return 1;
else if(exponent < 0)
e = - exponent;
else
e = exponent;
if(base == 0)
return 0;
double result = 1;
while(e)
{
if(e & 1)
result *= base;
base *= base;
e >>= 1;
}
return exponent < 0 ? (1 / result) : result;
}
};
之前没刷过类似的题, 很明显先想到循环相乘,那就O(n)复杂度了。
有想过分解开进行乘,感觉需要什么东东来优化一下步骤。
这是一个关于快速幂的知识,其实就是将幂转换成二进制形式, 比如说对于 ab,b 等于 9, 9 的二进制是 1001 , 然后 ab 就等于 a20 * a23 ,等效变换为 (a)2 * (a22)2 。
所以这样就好办了, 幂转换成二进制有几位就循环几次, 复杂度降低到O(log2 n)。 然后每次循环都对基数 a 进行自乘,也就是每次循环对 a 进行平方运算。当循环到幂的二进制表示中为1的位, 将其累乘起来就好了。
初次代码实现(注意:有错):
class Solution {
public:
double Power(double base, int exponent) {
if(exponent == 0)
return 1;
if(base == 0)
return 0;
double result = 1;
while(e)
{
if(e & 1)
result *= base;
base *= base;
e >>= 1;
}
return result;
}
};
提交检测后发现不对啊, 想了想, 自己只考虑了幂为 0 和非 0 的情况, 但是幂为负数的情况没有考虑。
所以接下来修改为:
class Solution {
public:
double Power(double base, int exponent) {
int e = -1;
if(exponent == 0)
return 1;
else if(exponent < 0)
e = - exponent;
else
e = exponent;
if(base == 0)
return 0;
double result = 1;
while(e)
{
if(e & 1)
result *= base;
base *= base;
e >>= 1;
}
return exponent < 0 ? (1 / result) : result;
}
};
相关文章推荐
- 面试题13:数值的整数次方(offer)
- 剑指offer系列-T11数值的整数次方
- 剑指offer之数值的整数次方
- (剑指Offer)面试题11:数值的整数次方
- 数值的整数次方
- 数值的整数次方(面试题 11)
- 【剑指offer】数值的整数次方
- 71.数值的整数次方
- 数值的整数次方
- 题目1514:数值的整数次方
- 《剑指Offer》面试题:数值的整数次方
- 剑指offer---数值的整数次方
- 数值的整数次方(剑指Offer)
- 剑指Offer之数值的整数次方
- 程序员面试题精选100题(44)-数值的整数次方[算法]
- 数值的整数次方
- 【面试题十一】数值的整数次方
- 剑指offer-面试题11:数值的整数次方
- 数值的整数次方
- 数值的整数次方