No.50 Pow

来源:互联网 发布:朝鲜拥核 知乎 编辑:程序博客网 时间:2024/05/22 09:03
1、思路一:

根据n的取值分三种情况,n>0、n==0和n<0,用循环依次累计乘法。

class Solution {public:    double myPow(double x, int n) {        double mul =1;        if(n==0){            return 1;        }        else if(n>0){            for(int i=0;i<n;i++)                mul *=x;        }        else{            for(int i=0;i>n;i--){                mul *= x;            }            mul = 1/mul;        }        return mul;    }};

提交结果为Time Limit Exceeded当x=0.00001,n=2147483647时超时。
2、思路二:
分治思想: x^n = x^(n/2) * x^(n/2) * x^(n%2),将x的n次方降幂为n/2,讨论n的奇偶性,如果n为奇数,则多乘一个v。
class Solution {public:    double myPow(double x, int n) {        if(n==0) return 1;        else if(n<0) return 1.0/myPow(x,-n);        else {            double v=myPow(x,n/2);            if(n%2==0) return v*v;            else return v*v*x;        }    }};

存在问题:x=1.00000,n=-2147483648时,显示Runtime Error。改为如下写法就可以顺利通过:

class Solution {public:    double myPow(double x, int n) {        if(n<0) return 1.0/power(x,-n);        else return power(x,n);    }private:    double power(double x,int n){        if(n==0) return 1;        double v=power(x,n/2);        if(n%2==0) return v*v;        else return v*v*x;    }};


0 0