326. Power of Three
Given an integer, write a function to determine if it is a power of three.
Follow up:
Could you do it without using any loop / recursion?
看到这种题目,第一想法就是用递归或者循环来做,但是题目要求了不能用这种方法来做,所以只能另想他法。
假设输入一个数 n,如果 n 是3的幂,那么 3^x = n, 即 x = log10(n) / log10(3), 这里使用了换底公式。那么这样的话就好办了,如果 n 是3的幂,那么x肯定是一个整数,
那么接下来只需要判断 x 是不是整数即可。
判断 x 为整数有两种方法:
1.将 x 强转为int类型,计算小数位是否为0
bool isPowerOfThree(int n) { double ret = log10(n) / log10(3); return ret == (int)ret; }
2.使用fmod函数
bool isPowerOfThree(int n) { double ret = log10(n) / log10(3); return n > 0 && fmod(ret, 1) == 0; }
则此题得解。
我在讨论区也见到一些别的解法,顺便在这里摘录一下(这几种方法的原理都是一样的,因为3是质数,所以3的幂中最大的整数如果能整除 n,那么n = 3 * ... * 3)
bool isPowerOfThree(int n) { return n>0 && 1162261467%n==0; // 其中的1162261467是3的幂中最大的整数 }
bool isPowerOfThree(int n) { int maxPowerOfThree = (int)pow(3, (int)(log(INT_MAX)/log(3))); return n>0 && maxPowerOfThree%n==0; }
bool isPowerOfThree(int n) { return n>0 && (int)pow(3, 19)%n==0; }