Given an integer, write a function to determine if it is a power of three.(给定一个整数,判断其是否是3的幂)
Follow up:
Could you do it without using any loop / recursion?(能否不使用循环或递归实现?)
1.个人分析
思路:最简单直观的做法是不断对3进行整除,如果不使用循环或者递归方法暂不知道,好像可以利用位运算来解决(其实位运算无法解决该问题)。
2.参考解法
(1)循环法
bool isPowerOfThree(int n)
{
if(n < 1)
return false;
while(n%3 == 0){
n /= 3;
}
return n == 1;
}
(2)整型的最大值
bool isPowerOfThree(int n)
{
return n > 0 && 1162261467 % n == 0;
}
该方法利用在整型的最大值范围内找出所有3的幂,而最大3的幂为1162261467,所以能被该数整除的数都是3的幂。
(3)数学方法
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
}
该解法是利用了数学公式来进行判断是否为3的幂。
3.总结
起初所想的迭代解法是没问题的,但后面所猜测的使用位操作来解决实际上是不行的,因为和判断2的幂和4的幂不同,这里无法利用某种位运算来得出特定的值。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。