LeetCode
剑指 Offer 16. 数值的整数次方
代码实现能力
- 错误1:
对于n很大时求幂,直接遍历,超时。 - 错误2:
对于n在边界时(2^31-1),直接做加法,越界。 - 错误3:
进行二分求幂,重复调用两次,超时。
例如:reuturn pow(x, n/2) * pow(x, (n+1)/2);
这里重复了,至于一次,用一个变量tmp记录即可。
思路+代码:
/**
* 剑指 Offer 16. 数值的整数次方
*
* 思路:
* 一、数学
* 矩阵快速幂(略)
* 二、代码实现能力
* 1. 求负数幂次方: 1/x 可得到
* 2. 二分乘法
* 求幂运算时,
*/
#include <iostream>
using namespace std;
class Solution
{
public:
// 二分求幂运算
// 第一次错误: return myPow() * myPow(); 还是超时。
// 求两次,重复求了,没有必要。
double myPow(double x, int n) {
long nn = n;
if (nn == 0)
return 1;
if (nn == 1)
return x;
if (nn == -1)
return (1.0 / x);
double tmp = myPow(x, n / 2);
tmp = tmp * tmp;
if (n % 2){
if (n > 0)
tmp = tmp * x;
else if (n < 0)
tmp = tmp * (1.0 / x);
}
return tmp;
}
// 该方法直接循环求幂,但是n太大,超时!
// 解决思路: 二分进行求幂运算!
/*
double myPow(double x, int n) {
if (x == 0){
return 0;
}
if (n == 0) {
return 1;
} else {
double tmp = 1;
int t = n;
if (n < 0)
t = -n;
for (int i = 1; i <= t; ++i) {
tmp *= x;
}
if (n > 0)
return tmp;
else
return (1.0 / tmp);
}
}
*/
};
// test程序
int main()
{
Solution a;
cout << a.myPow(2.00, -5) << endl;
return 0;
}