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
方案三:位运算
- 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0: n & ( n − 1 ) = = 0 n\&(n-1)==0 n&(n−1)==0
- 4的幂是2的偶数幂,所以最大的int类型的4的幂数为: 1010 ⋯ 1010 ⏟ 32 \underbrace{1010\cdots1010}_{32} 32 1010⋯1010
方案四:位运算+数学运算
- 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0: n & ( n − 1 ) = = 0 n\&(n-1)==0 n&(n−1)==0
- 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+3k−1+⋯+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)
}