此题思路简单明了,重点在于:考虑问题的全面性,即要考虑到当底数为0以及指数为0和负数的情况,将其单列出来。
注意点:1.由于计算机储存数据的精度有限,比较两个浮点数是否相等时,不能直接用等于,而是要考虑二者之间的差值,是否小于一个极小的值,若是,则可认为二者相等。
2.考虑到封装性,可以将计算乘方的函数单独列出来。
3.求乘方时,除了可以直接进行n次相乘,还可以考虑从递归的角度出发。鉴于有如下关系:
当n为偶数时,;
当n为奇数时,
即可以将PowerWithUnsigned函数进行递归形式的修改。
当然,也可以使用动态规划代替递归的部分。
class Solution {
public:
double Power(double base, int exponent) {
double res = 1.0;
unsigned int absExponent;
if (exponent == 0)
return 1;
else if (sequal(base, 0.0))
return 0;
absExponent = (unsigned int) exponent;
if (exponent < 0)
absExponent = (unsigned int)(-exponent);
res = PowerWithUnsigned(base, absExponent);
if (exponent < 0)
res = 1.0/res;
return res;
}
/*double PowerWithUnsigned(double base, unsigned int exponent) {
double res = 1.0;
while (exponent --) {
res = res * base;
}
return res;
}*/
double PowerWithUnsigned(double base, unsigned int exponent) {
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double res = PowerWithUnsigned(base, exponent >> 1);
res = res * res;
if (exponent & 1)
res = res * base;
return res;
}
bool sequal(double a1, double a2) {
if ((a1 - a2) > -0.0000001 && (a1 - a2) < -0.0000001)
return true;
else
return false;
}
};
京公网安备 11010502036488号