Power of Three

  • medium
  • tagged: math
  • similar:

判断一个整数是否是3的k次方. (不用loop/recursion怎么写?)

思路

  • 最简单的想法就是不断除以3, 直到余数不大于1. 此时之间判断是否为1.
  • 看了discuss看到了牛X解法:
    • 因为int最大为: 0x7FFF_FFFF, 所以找到的最大的3^k一定可以整除这个int! 这样主需要1次运算即可! 牛X.

idea 1

  • 即便algs简单如此, 我却写的很复杂, 这里是stefan的写法.
  • 代码如下:
public boolean isPowerOfThreeIter(int n) {
    if (n > 1) {
      while (n % 3 == 0) {
        n /= 3;
      }
    }
    return n == 1;
  }
  • 自然还有recursion写法. 认真理解递归思想: 即此时的解, 即下一步的解拼起来, 代码如下:
public boolean isPowerOfThreeRec(int n) {
    return n > 0 && (n == 1 || (n % 3 == 0 && isPowerOfThree(n/3)));
  }

idea 2: 牛X的数学方法: 1步!!!

  • 看看他是怎么找到最大的3的power, 利用了log性质: $$3^k = n \Rightarrow klog3 = log(n) \Rightarrow k = log(n) / log(3)$$
  • 代码如下:
public boolean isPowerOfThree(int n) {
    int maxPowerThree = (int) Math.pow(3, (int)(Math.log(0x7fff_ffff) / Math.log(3)));
    return n > 0 && maxPowerThree % n == 0;
  }