326. Power of Three

本文探讨了如何判断一个整数是否为3的幂次方。提供了三种方法:递归除法、最大3的幂次方数验证及对数计算。通过C++和Java实现,介绍了每种方法的工作原理及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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?


题意:

给定一个整数,写一个程序检测该整数是否是3的幂。


思路一:转载:http://www.cnblogs.com/grandyang/p/5138212.html

这道题让我们判断一个数是不是3的次方数,在LeetCode中,有一道类似的题目Power of Two,那道题有个非常简单的方法,由于2的次方数实在太有特点,最高位为1,其他位均为0,所以特别容易,而3的次方数没有显著的特点,最直接的方法就是不停地除以3,看最后的余数是否为1,要注意考虑输入是负数和0的情况,参见代码如下:

代码:递归版:136ms

class Solution {
public:
    bool isPowerOfThree(int n) {
        return n>0 && (n==1 || (n%3==0 && isPowerOfThree(n/3)));
    }
};
代码:轮询版:172ms

class Solution {
public:
    bool isPowerOfThree(int n) {
        while(n && n%3==0){
            n /= 3;
        }
        return n==1;
    }
};

思路二:

题目中的Follow up让我们不用循环,那么有一个投机取巧的方法,由于输入是int,正数范围是0-231,在此范围中允许的最大的3的次方数为319=1162261467,那么我们只要看这个数能否被n整除即可,参见代码如下:

代码:java版:20ms

public class Solution {
    public boolean isPowerOfThree(int n) {
        int maxPowerOfThree = (int)Math.pow(3, (int)(Math.log(0x7fffffff) / Math.log(3)));
        return n>0 && maxPowerOfThree%n==0;
    }
}
代码:java版:20ms

public class Solution {
    public boolean isPowerOfThree(int n) {
        return (n>0 && 1162261467%n==0);
    }
}
思路三:

最后还有一种巧妙的方法,利用对数的换底公式来做,高中学过的换底公式为logab = logcb / logca,那么如果n是3的倍数,则log3n一定是整数,我们利用换底公式可以写为log3n = log10n / log103,注意这里一定要用10为底数,不能用自然数或者2为底数,否则当n=243时会出错。当n=243时,

log(243) = 5.493061443340548 log(3) = 1.0986122886681098  

==> log(243)/log(3) = 4.999999999999999

log10(243) = 2.385606273598312 log10(3) = 0.47712125471966244  

==> log10(243)/log10(3) = 5.0

会有这样的原因是因为log(3)因为四舍五入,实际上比其真实值略大。

现在问题就变成了判断log10n / log103是否为整数,在c++中判断数字a是否为整数,我们可以用 a - int(a) == 0 来判断,参见代码如下:

代码:184ms

class Solution {
public:
    bool isPowerOfThree(int n) {
        return (n>0 && int(log10(n)/log10(3)) - log10(n)/log10(3)==0);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值