问题:
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?
我的解答:
class Solution {
public:
bool isPowerOfThree(int n) {
if(n==1) return true;
if (!(n % 2))
return false;
while (n>3)
{
if(n%3) return false;
n = n / 3;
}
if (n==3) return true;
else return false;
}
};
解释:这就是很平常的通过不断除以三并判断最后值来判断是否是三的幂的方法。注意到可以先判断是否为偶数来加快速度。
看了别人的代码,发现可以这样做,不过这样更慢了。152ms。思路是3的幂的最大值对所求证值取余,若该数是3的幂,那么余值为0.
class Solution {
public:
bool isPowerOfThree(int n) {
if(n<=0)return false;
int t = pow(3, (int)(log(INT_MAX)/log(3)));
return ( t%n==0);
}
};
还有人是这样做:
class Solution {
public:
bool isPowerOfThree(int n) {
return fmod(log10(n)/log10(3), 1)==0;
}
};
fmod所求的是double型余值。这是一些数学技巧,通过log换底公式可以证明。做到这里又想到,为什么要那么麻烦使用log10(n)/log10(3),而不用log3(n)呢,尝试了一下,发现根本就没有log3(n)这个函数,只能通过使用log10(n)/log10(3)来实现,在数学上是与log3(n)等价的。