2018-01-14 19:20:27
- Power of Three
问题描述:判断一个数是否为3的幂次,不允许使用循环或者递归。
方法一、使用3的最大幂次来判断
public boolean isPowerOfThree(int n) {
// 1162261467 is 3^19, 3^20 is bigger than int
// 如果不知道3的最大幂次,则可以通过以下方式进行计算
// int maxPowerOfThree = (int)Math.pow(3, (int)(Math.log(0x7fffffff) / Math.log(3)));
return n > 0 && (1162261467 % n == 0);
}
方法二、取对数来判断
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
}
需要注意的是,不能使用自然对数为底,因为在自然对数里,会在243数字上出点小差错。
log(243) = 5.493061443340548 log(3) = 1.0986122886681098 ==> log(243)/log(3) = 4.999999999999999 log10(243) = 2.385606273598312 log10(3) = 0.47712125471966244 ==> log10(243)/log10(3) = 5.0
发生这种情况是因为log(3)由于四舍五入实际上比它的真实值稍大,这使比率变小。
方法三、使用转换进制来判断
public boolean isPowerOfThree(int n) {
return Integer.toString(n, 3).matches("10*");
}
- Power of Two
问题描述:判断一个数是否为2的幂次,不允许使用循环或者递归。
方法一、使用2的最大幂次来判断
public boolean isPowerOfTwo(int n) {
return n > 0 && 1.073741824E9 % n == 0;
}
方法二、取对数来判断
public boolean isPowerOfTwo(int n) {
return (Math.log10(n)/Math.log10(2)) % 1 == 0;
}
方法三、使用进制法来判断
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
或者判断是否仅有一个1
public boolean isPowerOfTwo(int n) {
return n>0 && Integer.bitCount(n) == 1;
}
- Power of Four
方法一、取对数来判断
public boolean isPowerOfFour(int num) {
return (Math.log10(num)/Math.log10(4)) % 1 == 0;
}
方法二、使用进制来判断
public boolean isPowerOfFour(int num) {
// 0x55555555 is to get rid of those power of 2 but not power of 4
// so that the single 1 bit always appears at the odd position
return num > 0 && (num&(num-1)) == 0 && (num & 0x55555555) != 0;
}
或者直接转成4进制
public boolean isPowerOfFour(int num) {
return Integer.toString(num, 4).matches("10*");
}