ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 如何检查数字是否是基数b的幂?

2019-07-15 14:57:04  阅读:224  来源: 互联网

标签:python logarithm


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

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

这是我得到的:

假设n和base是整数> 0.

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

解决方法:

首先,假设您有一个特定的对数运算符(许多语言只提供基数10或基数e的对数),logab可以计算为logxb / logxa(其中x显然是您的语言提供的基数).

Python更好一点,因为它可以计算出任意基数的对数,而不需要上面那种棘手的相等.

所以,无论如何,您都可以通过某种方式获得特定基数的对数.从那里,如果基数a中的b的对数是整数(注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)请记住,浮点不精确可能意味着它不是一个整数.您可能必须使用“足够接近”的比较.

标签:python,logarithm
来源: https://codeday.me/bug/20190715/1468667.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有