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号字才能看得清啊。

发布了110 篇原创文章 · 获赞 132 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/HermitSun/article/details/103168842