leetcode50 快速幂

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
    double myPow(double x, int n) {

    }
};

递归

a n { 1 ( n 为 0 ) a n − 1 ∗ a ( n 为奇 ) a n 2 ∗ a n 2 ( n 为偶 ) a^n \left\{\begin{array}{l} 1 (n为0)\\ a^{n-1}*a (n为奇) \\ a^{\frac{n}{2}}*a^{\frac{n}{2}} (n为偶) \end{array}\right. an 1(n0)an1a(n为奇)a2na2n(n为偶)

class Solution {
public:
    double quickMul(double x, long long N) {
        if (N == 0) {
            return 1.0;
        }
        if ( N % 2 == 0 ) {
            double y = quickMul(x, N / 2);
            return  y * y ;
        }else{
            double y = quickMul(x, N -1);
            return y * x;
        }
        
        
    }

    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }
};

非递归

a n ,因为题目中指出 n 为整数 , 可将 n 表示为二进制整数 n = b 0 ∗ 2 0 + b 1 ∗ 2 1 + … + b k ∗ 2 k ( b i = 0 或 1 ) a n = a b 0 ∗ 2 0 + b 1 ∗ 2 1 + … + b k ∗ 2 k = ( a 2 0 ) b 0 ∗ … ∗ ( a 2 k ) b k ( a 2 i ) 为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法 在循环中通过 ( a 2 i ) = ( a 2 i − 1 + 2 i − 1 ) = ( a 2 i − 1 ) ∗ ( a 2 i − 1 ) 计算 ( a 2 i ) 当对应的 n 的二进制数的 b i 为 1 时,将计算的值乘到结果中 a^n,因为题目中指出n为整数,可将n表示为二进制整数\\ n= b_0*2^0+b_1*2^1 + … + b^k*2^k (b_i =0或1)\\ a^n= a^{b_0*2^0+b_1*2^1 + … + b^k*2^k} = (a^{2^0})^{b_0} * … * (a^{2^k})^{b_k} \\ (a^{2^i}) 为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法\\ 在循环中通过(a^{2^i}) = (a^{2^{i-1} +2^{i-1} }) = (a^{2^{i-1} })* (a^{2^{i-1} }) 计算(a^{2^i})\\ 当对应的n的二进制数的b_i为1时,将计算的值乘到结果中 an,因为题目中指出n为整数,可将n表示为二进制整数n=b020+b121++bk2k(bi=01)an=ab020+b121++bk2k=(a20)b0(a2k)bk(a2i)为底数,以上乘法的基础元素,所以可以用一个循环描述以上乘法在循环中通过(a2i)=(a2i1+2i1)=(a2i1)(a2i1)计算(a2i)当对应的n的二进制数的bi1时,将计算的值乘到结果中

转二进制

int BinaryOfInt(int i)
{
      while(i)
      {
            if(i & 1)
            {
            	cout<< 1;
            }
            else
            {
             	cout<< 0;
             }

            i = i >> 1;
      }

      return count;
}
// 注 : 以上将int转为二进制只适用于int为正的情况,对输入的负数右移系统仍会保持开头的标志位,负的情况可参考这篇计算负数中有多少个1的文章,其左移1然后与输入数值与,即可计算输入数值的对应二进制的值 https://blog.csdn.net/sdujava2011/article/details/39298031
// 八进制 int 0123;    十六禁止 int 0x15A; 

题解

class Solution {
public:
    double quickMul(double x, long long N) {
         double res = 1.0;
         for(int i = N; i != 0; i>>=1){//  i /= 2
            if(i & 1){ // if(i % 2 != 0){
                res *= x;
            }
            x *= x;
        }
        return  res;
        
    }

    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }
};

在这里插入图片描述

  • 将循环中的int i = N ,int换为 long long

CG

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值