在python中,如何检查数字n是否是基数b的精确幂?
注意:它需要推广到任何作为参数给出的基数。
这是我得到的:
假设n和base是整数> 0
import math
def is_power(n,base):
return math.log(n,base) == base**n
答案 0 :(得分:9)
首先,假设您有一个特定的对数运算符(许多语言仅提供基数10
或基数e
的对数),logab
可以计算为logxb / logxa
(其中) x
显然是您的语言提供的基础。)
Python更好一点,因为它可以计算任意基数的对数,而不会出现上面那种棘手的等式。
所以,无论如何,您都可以通过某种方式获得特定基数的对数。从那里开始,如果基础b
中的a
的日志是整数(注1),那么b
就是a
的幂。
所以我从以下代码开始,现在增加了边缘案例检测:
# Don't even think about using this for negative powers :-)
def isPower (num, base):
if base == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
power = int (math.log (num, base) + 0.5)
return base ** power == num
例如,请参阅以下完整程序,其中显示了此操作:
import math
def isPower (num, base):
if base == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
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 == 1 and num != 1: return False
if base == 1 and num == 1: return True
if base == 0 and num != 1: return False
testnum = base
while testnum < num:
testnum = testnum * base
return testnum == num
但要确保它针对您的最大数量和最小基数进行测试,以确保您不会受到任何性能冲击。
(注1)请记住,浮点不精确可能意味着它不是完全整数。你可能不得不使用“足够接近”的比较。
答案 1 :(得分:4)
一个非常简单的解决方案可能是这样的:
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
答案 2 :(得分: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来决定是否要应用琐碎的修复或重写他的要求。
答案 3 :(得分:-1)
>>>(math.log(int(num),int(base))).is_integer()
这将返回布尔值true或false。这应该工作正常。希望它有所帮助