gpt4 book ai didi

python - 如何检查一个数字是否是基数 b 的幂?

转载 作者:太空狗 更新时间:2023-10-30 00:28:22 24 4
gpt4 key购买 nike

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

注意:它需要泛化到作为参数给出的任何基数。

这是我得到的:

假设 n 和 base 是大于 0 的整数。

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

最佳答案

首先,假设您有一个特定的对数运算符(许多语言提供以 10 或仅以 e 为底数的对数),log<sub>a</sub>b可以计算为log<sub>x</sub>b / log<sub>x</sub>a (其中 x 显然是您的语言提供的基础)。

Python 更胜一筹,因为它可以计算出任意 底数的对数,而无需上面那个棘手的等式。

因此,不管怎样,您都有办法获得特定底数的对数。从那里,如果 b 的日志在基地a是一个整数(注1),那么ba的幂.

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

# 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) 请记住,浮点不精确可能意味着它不是完全整数。您可能不得不使用“足够接近”的比较。

关于python - 如何检查一个数字是否是基数 b 的幂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15352593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com