此题思路简单明了,重点在于:考虑问题的全面性,即要考虑到当底数为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; } };