一、4的幂
1.题目
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
-231 <= n <= 231 - 1
2.分析
这里涉及到几个知识点:
- 对数logn(N),N一定大于0
- 对数换底公式:loga(b) = logc(a) / logc(b)
- 浮点数运算不精确
- 浮点数相等的判断方法:两数相减的绝对值小于某一精度
因此,在进行对数换底公式的运算前:
- 通过判断 n > 0 先将小于等于0的数去掉;
- 在换底公式的运算时,由于得到的double类型的浮点数存在运算不精确的问题,如果本来应该得到的整数x是4,结果运算得到3.99999999999,类型强制转换后就会得到3,所以为了防止这个问题,在强转前加上一个精度,一般在1e-6 ~ 1e-10之间,这是一个经验值。
- 在判断 n == 4x 时,因为 Math.pow(4, x) 返回值是一个double类型的浮点数,所以不能直接用 == 来判断。
- 两数相减的绝对值小于某一精度,如果小于该精度,则返回true,否则返回false
3.代码
public boolean isPowerOfFour(int n) {
if (n > 0){
int i = (int) (Math.log10(n) / Math.log10(4) + 1e-10);
if (Math.abs(Math.pow(4, i) - n) < 1e-10){
return true;
}
}
return false;
}