判断数幂

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*");
}

 

posted @ 2018-01-14 20:04  hyserendipity  阅读(459)  评论(0编辑  收藏  举报