Description
Follow Up
Solution 1(C++)
class Solution {
public:
bool isPowerOfThree(int n) {
if(n<3) return n==1? true: false;
else return 3*(n/3) == n? isPowerOfThree(n/3): false;
}
};
Solution 2(C++)
class Solution {
public:
bool isPowerOfThree(int n) {
return fmod(log10(n)/log10(3), 1) == 0;
}
};
Solution 3(C++)
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);
}
};
算法分析
这道题目是判断一个数是否为3的幂,类似的题目有:LeetCode-231. Power of Two、LeetCode-784. Letter Case Permutation。
LeetCode官方多种Java版解法可参考:326. Power of Three Solution。
解法一: 那么最简单的方法就是通过迭代,可以利用本身的函数作为迭代函数,但是要注意迭代函数的迭代体与边界条件的设定。类似的题目还可以参考:LeetCode-21. Merge Two Sorted Lists、LeetCode-263. Ugly Number。
解法二: 就是利用数学的方法来解决,利用对数的换底公式,其实这个公式很简单,高中数学不知道做了多少遍,但是就是不知道在程序算法题中用出来。具体的解释可以参考LeetCode上Solution的解释:Approach #3 Mathematics [Accepted]。
解法三: 该解法就是找到int类型数据范围内:0~2147483647,3的最大次幂,然后如果n是3的幂,那么肯定比最大次幂小于或等于,那么用n去与最大次幂取模运算,其结果一定为0。更加详细具体的解释可以参考LeetCode上Solution的解释:Approach #4 Integer Limitations [Accepted]。
程序分析
这道题的程序编写首先要学会如何进行迭代函数的程序编写,这个过程要慢慢积累。
然后,积累一个新的函数fmod(),其解释可参考:fmod函数。
还有log10函数,可参考:CPlusPlus-log10
目前做的LeetCode的Tag是Math,所以已经不止一次遇到了C++中Cmath头文件里的函数了,是时候对其进行一波整理了。