神奇数学世界的魔力迷踪:破解3的幂次方之谜

神奇数学世界的魔力迷踪:破解3的幂次方之谜_第1张图片

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

神奇数学世界的魔力迷踪:破解3的幂次方之谜_第2张图片
昨天刚刚讲解完2的幂,今天就来看看3的幂。

思路1

3的幂不能像2的幂那样,直接看二进制中是否有且仅有一位为1,所以“2的幂”那道题中的前两种方法就失效了,但是方法3仍然能用,即判断该数是否是一个很大的3的幂次方的约数。代码如下:

bool isPowerOfThree(int n){
    // n是否为很大的3的幂次方的约数
    // 3^19=1162261467
    return n > 0 && 1162261467 % n == 0;
}

神奇数学世界的魔力迷踪:破解3的幂次方之谜_第3张图片

思路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;
}

神奇数学世界的魔力迷踪:破解3的幂次方之谜_第4张图片

总结

判断一个正整数n是不是另外一个正整数k的幂次方,可以从以下几个方面来考虑:

  1. 特殊思路,如“2的幂”可以转换为判断二进制中是否有且仅有一位为1,从而转换为使用特殊的位运算技巧,如n & n - 1或n & -n。
  2. 直观思路,让n反复除以k,直到不能整除为止。若最后的结果是1,就说明一开始的n是k的幂次方。
  3. 通用思路,直接判断n是不是一个很大的k的幂次方的约数。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展,c语言,开发语言)