检查数字 3^x * 5^y 的有效方法

Posted

技术标签:

【中文标题】检查数字 3^x * 5^y 的有效方法【英文标题】:Efficient way for checking number 3^x * 5^y 【发布时间】:2020-12-06 20:30:38 【问题描述】:

我想检查基于下限和上限的数字是否只有 3 和 5 的素数除数,并且数字应该是 3 的幂和 5 的幂的乘积。我目前的解决方案是这个。我想优化它,因为在我看来,用 for 循环检查权力不是好方法。提前致谢。

def checkNum(x):
    for i in range(1,50):
        for j in range(1,50):
            return x == (3**i) * (5**j)


def printResult(l, r):
    for i in range(l,r):
        if checkNum(i):
            print(i)

基于 cmets 我认为这是最好的方法:

def checkNum(x):
    while x%3==0:
        x = x //3
    while x%5==0:
        x = x//5
    return x==1

【问题讨论】:

你能想出一种方法来代替重复除法/取模吗?正常情况下你会如何手工解决问题? 只要数字能被 3 整除,就重复除以 3。只要数字能被 5 整除,就重复除以 5。你还剩下 1 吗? @FrankYellin 所以这就是你的意思? def checkNum(x): while x%3==0: x = x //3 while x%5==0: x = x//5 return x==1 @FrankYellin 这可能是一个更有效的循环,但它仍然是一个循环。 您对if i%3==0 and i%5==0: 的测试将排除一些xy 为零的候选人。以i=9 为例。 【参考方案1】:

我想优化它,因为用 for 循环检查权力并不好 在我看来。

在一系列随机数上,我们通过以下方式提高其速度:

def checkNum0(x):
    if x % 2 == 0:  # eliminate half the numbers in one test!
        return False

    while x % 15 == 0:  # speed up the process
        x = x // 15

    while x % 5 == 0:
        x = x // 5

    while x % 3 == 0:
        x = x // 3

    return x == 1

或者我们可以使用嵌套循环并将两个部分合并为一个:

def checkNum(x):
    if x % 2 == 0:  # eliminate half the numbers in one test!
        return False

    for divisor in (15, 5, 3):
        while (quotient_remainder := divmod(x, divisor))[1] == 0:
            x = quotient_remainder[0]

    return x == 1

【讨论】:

以上是关于检查数字 3^x * 5^y 的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

检查X数组的所有值是否在Y中。

1003. 检查替换后的词是否有效

将两个整数x和y有效地转换为浮点数x.y

如何检查用户的输入是否有效以及我正在寻找的数字?

如何简化检查一对数字是(1,2)还是(2,1)?

使用 LEFT OUTER JOIN 检查相关行不存在的最佳方法是啥