大家肯定会觉得,这个题简单,有啥好写的,用pow函数不就可以。确实也可以,但是我写这篇博客的意义在于,看到除了常规情况以外的细节,让我们的代码更完善。
注意点
- 当指数为0的情况
- 当指数为负数
- 当底数是0,底数是0的情况
注意
当底数是浮点数的时候,判断它是否为0,不能像整型一样直接判断将它==0,因为在计算机中不能够完全精准的的判断浮点数是否等于0,只能在一定范围内判断它和0相差很小,我们可以认为它等于(近似)0。
利用pow函数的常规解法
#include <iostream>
using namespace std;
int main()
{
double a;
int b;
cin >> a>>b;
cout << pow(a, b) << endl;
return 0;
}
自己实现一个pow函数的常规解法,当指数为负数时,且指数为1和0时,无法正确计算出结果,所以这种算法是不够完善的
int mypow(double a, int b)
{
double res = 1.0;
for (int i = 0; i < b; i++)
{
res = res*a;
}
return res;
}
更完善的解法
将x^n分成两种情况:
当n为奇数:x(n-1)/2 *x(n-1)/2 *x
当n为偶数:x(n/2) * x(n/2)
可以用递归方法来实现, 但是当指数为一个很大的数时,递归的效率就会很差,所以还是用非递归比较可靠
class Solution {
public:
double myPow(double x, long long n) {
//考虑指数为0或者底数为1的情况
if(n==0 || x==1.0)
{
return 1.0;
}
//判断底数是否为0
if(Isequal0(x))
{
return 0.0;
}
//指数为负
if(n<0)
{
return 1/pow(x,-n);
}
else{
return pow(x,n);
}
return 1.0;
}
double pow(double x, long long n)
{
double res=1.0;
while(n)
{
if(n&1==1)
res=res*x;
n = n>>1;
x=x*x;
}
return res;
}
bool Isequal0(double x)
{
if(abs(x-0.0)<0.0000001)
{
return true;
}
return false;
}
};