2的幂和3的幂和4的幂

有一段时间没写了,最近实在是太忙,被各种ddl搞得焦头烂额。今天忙里偷闲,写了几道有意思的题目。

这几道题其实没有任何难度,如果要判断一个数是不是n的幂,其实只要不断除以n,看看最后是不是1就行了,用几乎同一段代码就能AC这三道简单题;当然了,要改一下参数。概括下来,无非是这样:

bool isPowerOfN(int num, int N)
{
    double x = static_cast<double>(num);
    while (x > 1)
    {
        x /= N;
    }
    return x == 1.0;
}

但是这三道题各自有自己的tricky的解法。比如,要判断一个数是2的幂,有一个很神秘的解法就是判断n & (n - 1) == 0,因为一个数如果是2的幂,它和比它小1的数进行与运算的结果必然为0。所以可以简化成一行:

bool isPowerOfTwo(int n)
{
    return n > 0 && (n & (n - 1)) == 0;
}

对于3的幂来说,我好像没发现类似于这种的规律。但是看了官方题解之后,发现因为参数是int,所以输入的数是有上限的……也就是说,只要找到int范围内最大的3的幂,然后用这个数去除,看看能不能除尽就行了。32位的int范围内最大的3的幂是3**19,也就是1162261467:

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

4的幂不能这么做,因为4的幂同时是2的幂。但是因为相比3的幂,int范围内的4的幂数量更少,事实上只有15个,完全可以直接枚举:

bool isPowerOfFour(int num)
{
    return num == 1 ||
        num == 4 ||
        num == 16 ||
        num == 64 ||
        num == 256 ||
        num == 1024 ||
        num == 4096 ||
        num == 16384 ||
        num == 65536 ||
        num == 262144 ||
        num == 1048576 ||
        num == 4194304 ||
        num == 16777216 ||
        num == 67108864 ||
        num == 268435456 ||
        num == 1073741824;
}

插两句有的没的。之前试用了一下据说很好用的MarkText,感觉并不是很好用,而且安装包很大,感觉不如Typora。Typora还是要18号字才能看得清啊。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值