标签:
这个题让我们自己实现一个 pow(x,y) 函数,看起来简简单单的一个函数,我相信绝对可以难倒一片人的,因为我们很难将它"写对"。我之前其实也见过这个题的,在剑指offer上就出现过了,我感觉我写这个算法没有问题的,我考虑了很多方面而导致程序看起来比较的乱,最终修改了好几次才正确。
我个人感觉这个题比较重要的一点是 pow(x,y) 的功能的处理比凸显代码能力吧,首先比如: pow(3,10) 难道我们要使用循环10次的方法一个一个的乘吗?当然不能这样我给你个 pow(3,1000) , pow(3,10000) 这些难道我们都是用循环一个一个的乘?显然不是。
另外我在提交的时候发现了一个问题,就是当指数为 -2147483648 的时候,我们该怎么处理这种情况呢?我当时没有考虑这个问题的,但是提交的时候暴露出来了,例如 pow(-1,-2147483648) ,它的结果是多少呢? 答案是 1 ,而pow(2,-2147483648) 的值为0,但我个人觉得有点不妥(我考虑的是int类型的范围),大家也可以提出质疑。我在代码中给出了一些注释,可以看出来哪些细节需要注意,大家可以参考一下。
class Solution { public: double myPow(double x, int n) { /* -2147483648到底算正数还是负数 x=-1 n=-2147483648 >> 1 x=2 n=-2147483648 >> 0 */ //指数为0, 0^0 = 1 if (n == 0) { return 1; } //注意double与0的比较 if (x <= 0.00001 && x > (-0.00001) ) { return 0; } //底数为1或-1 if(x==-1 || x==1) { if(n%2==0 && x==-1) { return -x; } return x; } //指数为1 if (n == 1) { return x; } //无效输入的情况,(-3)^(-3)无效 if (n < 0 && x < 0 && n % 2 != 0) { return 0; } if (n == (int)pow(2,31)) {//底数不为1或-1的时候,该值的结果应该返回0,但是个人感觉该值没有什么意义 return 0; } double value = 0; bool isminusN = false; //指数的正负 if (n < 0) {// n为负数 isminusN = true; n *= -1; } //获取指数运算的结果 value = getNum(x, n); //n为偶数时 if (isminusN) {//指数为负数 return 1 / value; } else {//指数为正数 return value; } } double getNum(double x,int n) { if (n == 1) { return x; } if (n == 2) { return x*x; } return getNum(x, n / 2)*getNum(x, n - (n / 2)); } };最后的结果是通过了,这种题给我们的启示就是我们需要很细心的去思考,并注意一些易错的问题。
标签:
原文地址:http://blog.csdn.net/zr1076311296/article/details/51475978