5

在 python 中,如何检查数字 n 是否是底数 b 的精确幂?

注意:它需要推广到作为参数给出的任何基础。

这是我得到的:

假设 n 和 base 是 > 0 的整数。

import math
def is_power(n,base):
    return math.log(n,base) == base**n
4

4 回答 4

10

首先,假设您有一个特定的对数运算符(许多语言仅提供对数10或基数e),可以计算为(显然是您的语言提供的基数)。logablogxb / logxax

Python 做得更好,因为它可以计算出任意基数的对数,而无需上面那个棘手的等式。

因此,通过一种或另一种方式,您有一种方法可以对特定的基数进行取数。从那里开始,如果bin 基数a的对数是整数(注 1),则b是 的幂a

所以我将从以下代码开始,现在添加边缘情况检测:

# Don't even think about using this for negative powers :-)

def isPower (num, base):
    if base in {0, 1}:
        return num == base
    power = int (math.log (num, base) + 0.5)
    return base ** power == num

例如,请参见以下完整程序,该程序显示了这一点:

import math

def isPower (num, base):
    if base in {0, 1}:
        return num == base
    power = int (math.log (num, base) + 0.5)
    return base ** power == num

print isPower (127,2)       # false
print isPower (128,2)       # true
print isPower (129,2)       # false
print

print isPower (26,3)        # false
print isPower (27,3)        # true
print isPower (28,3)        # false
print isPower (3**10,3)     # true
print isPower (3**129,3)    # true
print

print isPower (5,5)         # true
print isPower (1,1)         # true
print isPower (10,1)        # false

如果你是那种担心浮点运算的人,你可以通过重复乘法来做到这一点,但你应该测试这种解决方案的性能,因为它在软件中可能比在硬件中慢得多。这对于诸如此类的事情并不重要,isPower(128,2)但它可能会成为isPower(verybignum,2).

对于上述代码的非浮点变体:

def isPower (num, base):
    if base in {0, 1}:
        return num == base
    testnum = base
    while testnum < num:
        testnum = testnum * base
    return testnum == num

但请确保它已针对您的最大数量和最小基数进行测试,以确保您不会受到任何性能冲击。


(注 1)请记住,浮点不精确可能意味着它不完全是整数。您可能不得不使用“足够接近”的比较。

于 2013-03-12T03:12:27.840 回答
5

一个非常简单的解决方案可能是这样的:

def ispower(n, base): 

    if n == base:
        return True

    if base == 1:
        return False

    temp = base

    while (temp <= n):
        if temp == n:
            return True
        temp *= base

    return False

结果:

>>> ispower(32, 2)
True
>>> ispower(81, 3)
True
>>> ispower(625, 5)
True
>>> ispower(50, 5)
False
>>> ispower(32, 4)
False
>>> ispower(2,1)
False
>>> ispower(1,1)
True
于 2013-03-12T03:20:00.150 回答
0
>>> def isPower(n, b):
...   return b**int(math.log(n, b)+.5)==n
... 
>>> isPower(128, 2)
True
>>> isPower(129, 2)
False
>>> isPower(3**10, 3)
True
>>> isPower(3**129, 3)
True
>>> isPower(10**500, 10)
True
>>> isPower(10**(10**6), 10)
True


编辑:此代码确实失败1,1

>>> isPower(1,1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in isPower
ZeroDivisionError: float division by zero

我将把它留给 OP 来决定他是要应用微不足道的修复还是重写他的要求。

于 2013-03-12T03:16:40.410 回答
-1

>>>(math.log(int(num),int(base))).is_integer()

这将返回一个布尔值 true 或 false。这应该可以正常工作。希望能帮助到你

于 2017-02-18T20:24:13.907 回答