快速幂

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 @   lwx_R  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示