LeetCode 050 Pow(x, n)

本文介绍了一种使用快速幂算法来高效计算一个数的n次方的方法,并针对特殊情况(如n为int类型最小值)进行了异常处理。通过递归二分的方法实现了O(logn)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求一个数的n次方。

n给的是int类型的,但是其实n取到-2147483648时,程序会出现问题,不知道为什么。只有特殊处理了。

采用二分的方法对n进行处理,这样的话迭代会很快。O(logn)的时间复杂度。


class Solution {
public:
    double myPow(double x, int n) {
        //double sum=1;
        if(x==1.0)return x;
        if(x==-1.0&&(n%2==0))return -1*x;
        else if(x==-1.0&&((n%2+2)%2==1))return x;
        if(n>0){return binary(x,n);}
        else if(n<0){n*=-1;return 1/binary(x,n);}
        else return 1;
    }
    double binary(double sum,int nn){
        if(nn==1)return sum;
        if(nn%2)return binary(sum*sum,nn>>1)*sum;
        else return binary(sum*sum,nn>>1);
    }
};

刚刚试验下,原来是由于int的范围为-2147483648到-2147483647,当n为-2147483648时,我会将它转化为正数,这样的话,会超出int的范围,导致溢出。

class Solution {
public:
    double myPow(double x, int n) {
        //double sum=1;
        //if(x==1.0)return x;
        if(n>0){return binary(x,n);}
        else if(n<0){if(n==-2147483648){n/=2;x*=x;}n*=-1;return 1/binary(x,n);}
        else return 1;
    }
    double binary(double sum,int nn){
        if(nn==1)return sum;
        if(nn%2)return binary(sum*sum,nn>>1)*sum;
        else return binary(sum*sum,nn>>1);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值