题目及测试
package pid326;
/* 3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例 1:
输入: 27
输出: true
示例 2:
输入: 0
输出: false
示例 3:
输入: 9
输出: true
示例 4:
输入: 45
输出: false
进阶:
你能不使用循环或者递归来完成本题吗?
*/
import java.util.List;
public class main {
public static void main(String[] args) {
int [] testTable = {15,9,27};
for (int ito : testTable) {
test(ito);
}
}
private static void test(int ito) {
Solution solution = new Solution();
boolean rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.isPowerOfThree(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,22ms,很快)
用递归的方法,不断除3,再给自身
package pid326;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
public class Solution {
public boolean isPowerOfThree(int n) {
if(n<=0){
return false;
}
if(n==1){
return true;
}
if(n%3!=0){
return false;
}
return isPowerOfThree(n/3);
}
}
解法2(成功,87ms,速度很慢)
循环除3
public boolean isPowerOfThree(int n) {
if(n<=0){
return false;
}
if(n==1){
return true;
}
while(n!=1){
if(n%3!=0){
return false;
}
n=n/3;
}
return true;
}
解法3(别人的,最快的方法)
题目中的Follow up让我们不用循环,那么有一个投机取巧的方法,由于输入是int,正数范围是0-2 ^ 31,在此范围中允许的最大的3的次方数为3 ^ 19=1162261467,那么我们只要看这个数能否被n整除即可,参见代码如下:
class Solution {
public:
bool isPowerOfThree(int n) {
return (n > 0 && 1162261467 % n == 0);
}
};
解法4(别人的)
利用对数的换底公式来做,高中学过的换底公式为logab = logcb / logca,那么如果n是3的倍数,则log3n一定是整数,我们利用换底公式可以写为log3n = log10n / log103,注意这里一定要用10为底数,不能用自然数或者2为底数,否则当n=243时会出错,原因请看这个帖子。现在问题就变成了判断log10n / log103是否为整数,在c++中判断数字a是否为整数,我们可以用 a - int(a) == 0 来判断,参见代码如下:
class Solution {
public:
bool isPowerOfThree(int n) {
return (n > 0 && int(log10(n) / log10(3)) - log10(n) / log10(3) == 0);
}
};