1.题目要求判断一个数是否为3的k次幂,如果是则输出true,否则输出false
2.我们可以使用简单的递归进行判断,时间复杂度为O(logn),其中log的底数为3。代码如下:
[c language=”++”]
class Solution {
public:
bool isPowerOfThree(int n) {
if (n < 3)
{
if (n == 1) return true;
else return false;
}
else
{
if (n % 3 == 0)
return isPowerOfThree(n / 3);
else return false;
}
}
};
[/c]
3.其中,题目额外提示,能不能使用非递归和非循环的方法实现。
我们来分析一下题目,题目中要求判断的数的类型为int,即最大为2^31-1,而3^k次方中,k会比31小,所以答案个数是非常有限的,我们把所有的列出来,如下:
1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907,43046721,129140163,387420489,1162261467
答案一共只有20个,我们可以直接判断n是否等于上面20个数中的某一个即可。
另外,再深入分析,我们可以看到,上述所有数都可以整除1162261467,1162261467是int类型中3的最大幂次方,它的质因数只有3,而其他小于1162261467的3的幂次方的质因数也只有3,如果包含了其他质因数,则这个数肯定不是3的幂次方。于是我们有了更简单的判断方法,判断n是否能被1162261467整除即可,代码如下:
[c language=”++”]
class Solution {
public:
bool isPowerOfThree(int n) {
return n>0 ? !(1162261467 % n) : 0;
}
};
[/c]
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?