【问题标题】:Finding a number from a list that has the most prime factors从具有最多质因数的列表中查找一个数字
【发布时间】:2021-05-18 13:47:04
【问题描述】:

我已经给出了一个数字列表,问题是找到具有最多不同质因数的数字。我试过这段代码来计算小于给定数字的素数:

number=int(input())
def is_prime(n):
    if n<=1:
        return False
    
    for i in range(2,n):
        if n%i==0:
           return False
    return True


primes=[]
count=0
for x in range(2,number):
    if is_prime(x)==True:
        count+=1
        primes.append(x)

print(primes)
print(count)

但我不知道如何继续确定所需的数字。

【问题讨论】:

  • 那么 20 有多少个质因数? 2个还是3个?
  • 哇,有时间限制吗?您可能想研究使用一种有效的方法(例如埃拉托色尼筛法)预先计算素数数组,然后与之进行比较。
  • 你应该有数字列表。那么你必须计算列表中每个数字的质数。最终得到质数最多的那个
  • 您是否有一个任意数字的列表,您需要从中确定具有最多质因数的数字,或者是否有特定形式的列表 [1,n]?您的措辞建议前者,但您的代码建议后者。这是两个非常不同的问题。对于第二个问题,可以将其视为如何构造一个具有许多质因数的数的问题。
  • @AvenDesta 必须是 2.(2 和 5)。但我很惊讶你从哪里带来了 20? :D

标签: python


【解决方案1】:

要计算n(称为omega(n))的不同质因数的数量,您可以利用三个想法:

  1. 每个数字要么是素数,要么有一个小于或等于其平方根的素数除数

  2. 除 2 以外的所有质因数都是奇数

  3. 一旦找到这样的素数除数,就可以将目标数减少该除数的尽可能多的因数,从而不断减小问题的规模。

这些想法的一个实现:

def omega(n):
    """counts the number of distinct prime factors of n"""
    if n < 2:
        return 0
    else:
        count = 0
        if n % 2 == 0:
            count += 1
            while n % 2 == 0:
                n //= 2
        d = 3
        while d*d <= n:
            if n % d == 0:
                count += 1
                while n % d == 0:
                    n //= d
            d += 2
        if n > 1:
            count += 1
    return count

要查找给定列表中的哪个数字具有最多的不同质因数,您可以使用 Python 内置函数 max 具有可选的 key 参数这一事实:

def max_primes(nums):
    return max(nums,key = omega)

例如,

>>> max_primes([1,2,42,200,210,211,360])
210

请注意,关系是可能的,甚至是可能的。给定列表中通常不会存在一个数,它的素数比所有其他数都多。例如,

>>> max_primes(range(101))
30
>>> omega(30)
3
>>> [n for n in range(101) if omega(n) == 3]
[30, 42, 60, 66, 70, 78, 84, 90]

您可以修改max_primes 函数以返回列表中具有最大质数的所有数字的列表。为此,您可以创建一个字典,其键是给定的数字,其值是素数。将max 应用于值,然后使用列表推导提取相应的键。

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多