原题链接
前言
数的幂是属于数学题,常常运用数学思维来解题,也可用位运算巧解
一、题目描述
给你一个整数 n,请你判断该整数是否是 num 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == num^x ,则认为 n 是 num的幂次方。
二、题目分析
题目本身容易理解,大家很容易想到使用while循环迭代暴力求解,其实也未必不行。但是其本身是数学题,那么可不可以用数学方法求解呢?
对数 是高中基本常识,已知底数和真数,求得log值 x , 再判断 底数的x次方是否与n相等。
所用到换底公式:
l
o
g
a
(
N
)
/
l
o
g
b
(
n
)
=
l
o
g
n
(
N
)
log_a (N) / log_b(n) = log_n(N)
loga(N)/logb(n)=logn(N)
三、题目解法
/** 3 的幂 **/
class Solution {
public boolean isPowerOfThree(int n) {
if( n == 0 )
return false;
int x = (int)(Math.log(n) /Math.log(3) + 1e-8);
return n == Math.pow(3,x);
}
}
/**4的幂 **/
class Solution {
public boolean isPowerOfFour(int n) {
if( n == 0)
return false;
int x = (int)( Math.log(n) / Math.log(4) + 1e-8);
return n == Math.pow(4,x);
}
}
四、2的幂的位运算解法
n&(n-1) == 0;
意思是,讲数n的二进制数 从右往左 的最后一位 1 往后全部转换为0,然后判断数此时是否为0,如果为0,则是2的幂,如果不是0,则反之
举例:
1.
n 10000
n-1 01111
n&(n-1) 00000
则n为2的幂
n 10100
n-1 10011
n&(n-1) 10000
则 n不为2的幂
解法代码:
//2的幂
class Solution {
public boolean isPowerOfTwo(int n) {
return (n > 0 && (n&(n - 1)) == 0);
}
}
五、使用库函数
Math.log(int);
Math.pow(int , double) ;