快速幂

1.递归

每次吧结果相乘

//递归快速幂 
double myPow(double x, long long n) {
        //x x2 x4 x8 x16*x
        if(n >= 0){
            return quickPow(x,n);
        }else{
			//n为负数情况 
            n=-n;
            return 1.0/quickPow(x,n);
        }
    }
double quickPow(double x,long n){
    if(n==0){
        return 1;
    }
    double t=myPow(x,n/2);
    if(n % 2 == 0){
        
        return t*t;
    }else{
        
        return t*t*x;
    }
}

2.迭代+位运算

//递推法
考虑吧n写成二进制,多项式推导之后发现
每次用x当前二进制位2的i次方

double myPow(double x, int n) {
    double ans=1;
    long N=n;
    if(N<0){
        N=-N;
        x=1.0/x;
    }
    while(N){
        if(N&1){
            ans=ans*x;
        }
        //每次x值都会再*x 但是当二进制位为0时 不会和结果相乘
        x=x*x;
        N>>=1;
    }
    return ans;
  } 
posted @ 2022-10-04 19:17  lwx_R  阅读(30)  评论(0)    收藏  举报