
本篇博客会讲解力扣“326. 3 的幂”的解题思路,这是题目链接。

 昨天刚刚讲解完2的幂,今天就来看看3的幂。
思路1
3的幂不能像2的幂那样,直接看二进制中是否有且仅有一位为1,所以“2的幂”那道题中的前两种方法就失效了,但是方法3仍然能用,即判断该数是否是一个很大的3的幂次方的约数。代码如下:
bool isPowerOfThree(int n){
    // n是否为很大的3的幂次方的约数
    // 3^19=1162261467
    return n > 0 && 1162261467 % n == 0;
}
 

思路2
不过大家可能忽略了最简单的思路。我们可以不断地除以3,直到不能整除为止。如果最后n的结果是1,就说明一开始的n是3的幂。
bool isPowerOfThree(int n){
	if (n <= 0)
	{
		return false;
	}
	// 反复除以3,直到不能整除为止
	while (n % 3 == 0)
	{
		n /= 3;
	}
	return n == 1;
}
 

总结
判断一个正整数n是不是另外一个正整数k的幂次方,可以从以下几个方面来考虑:
- 特殊思路,如“2的幂”可以转换为判断二进制中是否有且仅有一位为1,从而转换为使用特殊的位运算技巧,如n & n - 1或n & -n。
 - 直观思路,让n反复除以k,直到不能整除为止。若最后的结果是1,就说明一开始的n是k的幂次方。
 - 通用思路,直接判断n是不是一个很大的k的幂次方的约数。
 
感谢大家的阅读!



















