Power of Three

22 篇文章 0 订阅

https://leetcode.com/problems/power-of-three/

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的次方数没有显著的特点,最直接的方法就是不停地除以3,看最后的余数是否为1,要注意考虑输入是负数和0的情况,参见代码如下:

解法一:

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

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

解法二:

bool isPowerOfThree(int n) {
return (n > 0 && 1162261467 % n == 0);
}

最后还有一种巧妙的方法,利用对数的换底公式来做,高中学过的换底公式为loga(b) = logc(b) / logc(a),那么如果n是3的倍数,则log3(n)一定是整数,我们利用换底公式可以写为log3(n) = log10(n) / log10(3),注意这里一定要用10为底数,不能用自然数或者2为底数,否则当n=243时会出错。现在问题就变成了判断log10n / log103是否为整数,在c++中判断数字a是否为整数,我们可以用 a - (int)(a) == 0 来判断,参见代码如下:

解法三:

bool isPowerOfThree(int n) {
    if(n < 0)
        return false;

    double re = log10(n) / log10(3);
    return ((int)(re) - re == 0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值