有一段时间没写了,最近实在是太忙,被各种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号字才能看得清啊。