如何实现无需取整对数的3的幂数判断代码?
判断数字是否为3的整数次幂(无浮点精度问题方案)
浮点对数的精度问题确实没法靠调整保留小数位数彻底解决,因为不同数值的精度偏差不一样,很容易踩坑。给你几个完全避开浮点运算的实现方案,彻底解决精度问题:
方案一:循环整数除法
思路很直观:如果n是正整数,就不断用整数除法除以3,直到它不能被3整除,最后检查剩余的数是否为1(1是3^0)。
def isPowerOfThree(n): if n <= 0: return False while n % 3 == 0: n = n // 3 return n == 1
- 示例:输入243时,会被连续除以3五次,最终得到1,返回True;输入531440时,第一次取模3就不为0,直接返回False。
- 优点:没有数值范围限制,逻辑简单易懂,完全避免精度问题。
方案二:利用最大3次幂取模
在常规整数范围内(比如231-1以内),最大的3的整数次幂是319 = 1162261467。如果n是3的正整数次幂,那么它一定是这个数的约数,取模结果为0;反之则不为0。
def isPowerOfThree(n): return n > 0 and 1162261467 % n == 0
- 示例:243是1162261467的约数,返回True;531440不是,返回False。
- 优点:时间复杂度O(1),效率极高;缺点:仅适用于n ≤ 3^19的场景,如果题目允许n为极大整数,这个方法不适用。
方案三:递归实现
逻辑和循环法一致,只是用递归替代循环:
def isPowerOfThree(n): if n <= 0: return False if n == 1: return True if n % 3 != 0: return False return isPowerOfThree(n // 3)
- 注意:如果n极大,递归深度可能超出Python默认的递归栈限制,此时循环法更稳妥。
内容的提问来源于stack exchange,提问作者ng123
相关产品推荐
相关产品推荐

