Leetcode342. 4的幂

Leetcode342. 4的幂

题目:
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
题解:
方案一:循环

方案二:数学计算
n = 4 i , i = l o g 4 n = l o g b n l o g b 4 n=4^i,i=log_4{n}= \frac {log_b{n}}{log_b{4}} n=4i,i=log4n=logb4logbn

方案三:位运算

  1. 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0: n & ( n − 1 ) = = 0 n\&(n-1)==0 n&(n1)==0
  2. 4的幂是2的偶数幂,所以最大的int类型的4的幂数为: 1010 ⋯ 1010 ⏟ 32 \underbrace{1010\cdots1010}_{32} 32 10101010

方案四:位运算+数学运算

  1. 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0: n & ( n − 1 ) = = 0 n\&(n-1)==0 n&(n1)==0
  2. 4的幂: 4 k = ( 3 + 1 ) k = 3 k + 3 k − 1 + ⋯ + 3 1 + 1 4^k=(3+1)^k=3^k+3^{k-1}+\cdots+3^1+1 4k=(3+1)k=3k+3k1++31+1,也就是对3取余数得1

scala代码如下:

/**
    * 循环
    *
    * @param num
    * @return
    */
  def isPowerOfFour(num: Int): Boolean = {

    var num1 = num
    while (num1 % 4 == 0) {
      num1 = num1 / 4
    }
    num1 == 1
  }

  /**
    * 数学计算
    *
    * @param num
    * @return
    */
  def isPowerOfFour2(num: Int): Boolean = {
    //通过对1取余,取出小数部分,看是不是0
    Math.round(Math.log(num) / Math.log(4)) % 1 == 0
  }

  /**
    * 位运算
    * 4的幂转换为二进制,偶数部分为1,奇数部分为0
    * 因此 4 的幂与数字 (101010...10)向与会得到 0。
    *
    * 1010...1010(32位)转换为16进制为aaaaaaaa
    *
    * @param num
    * @return
    */
  def isPowerOfFour3(num: Int): Boolean = {
    (num > 0) && ((num & (num - 1)) == 0) && ((num & 0xaaaaaaaa) == 0)
  }

  /**
    * 位运算+数学运算
    * 首先是2的幂,4的幂是2的偶数幂
    *
    * @param num
    * @return
    */
  def isPowerOfFour4(num: Int): Boolean = {
    (num > 0) && ((num & (num - 1)) == 0) && (num % 3 == 1)
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值