解法:快速幂
算法解析
要考虑到特殊值和边界条件。
特殊值:
(1)底数为0,且指数为0,
0
0
0^0
00没有意义,约定结果为1。
0
0
=
1
0^0=1
00=1
(2)底数为0,且指数不为0,结果为0。
0
n
=
0
0^n=0
0n=0
(3)底数为1,且指数为任意值,结果为1。
1
n
=
1
1^n=1
1n=1
(4)底数不为0,且指数为0,结果为1。
x
0
=
1
x^0=1
x0=1
边界值:
(1)题目要求不考虑大数问题。忽略底数的边界。
(2)指数为负数时,可以先对指数求绝对值,再把底数取倒数。
问题在于当指数
n
=
−
2147483648
n=-2147483648
n=−2147483648,由于n是有符号整型,最大值是2147483647,无法保存2147483648这个结果,可以用long long类型来保存。
// 判断浮点数是否相等
int fequal(double a, double b)
{
double eps = 1e-6;
double c = a-b > 0 ? a-b : b-a;
return c < eps ? 1 : 0;
}
double myPow(double x, int n){
// 特殊值直接返回结果
// 0^0没有意义
if(fequal(x, 0.0) && n == 0) return 1;
// 底数为0
else if(fequal(x, 0.0)) return 0;
// 底数为1, 注意浮点数x判断相等的方式
else if(fequal(x, 1.0)) return 1;
// 指数为0
else if(n == 0) return 1;
// 指数n为负
// 当n=-2147483648,取相反数会溢出,可使用long long 来保存
long long p = n;
if(p<0)
{
p = -p;
x = 1/x;
}
// 一般情况
double r =1;
while(p)
{
if(p&1)
{
r = r*x;
}
x = x * x;
p = p >> 1;
}
return r;
}