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?
循环的方法,最直观简单。耗时128ms.
<span style="font-size:18px;">class Solution {
public:
bool isPowerOfThree(int n) {
while(n!=0 && n%3==0)
{
n = n/3;
}
if(n == 1)
return true;
return false;
}
};</span>
当然,也可以用递归的方法实现。跟循环相比原理类似,不贴代码了。
方法2:
哈哈,百度搜了一下看到了这个帖子,leetcode 中有哪些题的解法让你拍案叫绝?里面第一个人的回复就是下面这个方法。这个方法一看就令人恍然大悟,但是貌似也挺耗时的,132ms,诶诶欸~~~和第一种循环的方法比较起来真是没差欸
class Solution {
public:
bool isPowerOfThree(int n) {
//1162261467 = 3^19, 3^20 is bigger than int.
return (n>0&&1162261467%n == 0);
}
};
方法3:
十分通用的方法,只是使用数学计算。
计算Power Of Two的问题,可以使用位运算;详细解决见Power Of Two
计算Power Of N(N>=3)时候,此时就可以采用log的数学运算了。
耗时152ms。
采用这种方法实现需要注意如下两点:
(1)很多人提到了243这个错误数据,恩,之前采用double res = log(n)/log(3)的时候会出错,断点调试查看的是浮点误差的影响。将这句话中的log改为log10就会发现bug fixed.
(2)如果,这个时候还有错误,那就是你最后的判断给的误差太小,楼主最开始用的是10e-6结果错误一大片,改成了10e-15终于accepted.
代码如下:
class Solution {
public:
bool isPowerOfThree(int n) {
if(n <=0)
return false;
double res = log10(n)/log10(3);
return ((res - int(res)) <10e-15);
}
};