326. 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?

我的解答:

class Solution {
public:
    bool isPowerOfThree(int n) {
            if(n==1) return true;
        if (!(n % 2))
        return false;

    while (n>3)
    {
        if(n%3) return false;
        n = n / 3;
    }
    if (n==3) return true;
    else return false;
    }
};

解释:这就是很平常的通过不断除以三并判断最后值来判断是否是三的幂的方法。注意到可以先判断是否为偶数来加快速度。

看了别人的代码,发现可以这样做,不过这样更慢了。152ms。思路是3的幂的最大值对所求证值取余,若该数是3的幂,那么余值为0.

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n<=0)return false;
        int t = pow(3, (int)(log(INT_MAX)/log(3)));
    return ( t%n==0);
    }
};

还有人是这样做:

class Solution {
public:
    bool isPowerOfThree(int n) {
     return fmod(log10(n)/log10(3), 1)==0;
    }
};

fmod所求的是double型余值。这是一些数学技巧,通过log换底公式可以证明。做到这里又想到,为什么要那么麻烦使用log10(n)/log10(3),而不用log3(n)呢,尝试了一下,发现根本就没有log3(n)这个函数,只能通过使用log10(n)/log10(3)来实现,在数学上是与log3(n)等价的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值