您的位置:首页 > 其它

刷题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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: