【问题标题】:Verify which numbers are prime in the list验证列表中哪些数字是素数
【发布时间】:2019-05-19 13:36:41
【问题描述】:

我正在尝试验证列表中的哪些数字是素数。

vetor = [2,3,4,5,11,15,20]
divisions_list = []

def isprime():                     
    divisions = 0
    i = 0
    for i in range(1, vetor[i+1]):
        if i % i == 0:
            divisions = divisions + 1
            divisions_list.append(divisions)
        if divisions == 2:
            print('The number {} is prime'.format(vetor[i]))
        else:
            print('The number {} is not prime'.format(vetor[i]))

print(isprime())

但这不起作用,我只收到:

数字 3 不是素数 数字 4 是素数 无

我该如何解决这个问题?

【问题讨论】:

  • 当您询问有关错误的 python 问题时,您需要发布整个回溯,因为它包含有助于解决问题的重要信息。请编辑您的问题并添加它。
  • 似乎您意外使用了变量i 两次。尝试命名另一个j

标签: python loops iteration primes


【解决方案1】:

您已经有一段代码接受一个数字并检查它是否是素数,然后您重新发明轮子并在此过程中破坏了它而不是使用它(例如,您重新使用了i这导致除以零并尝试检查列表是否等于 2 而不是检查其长度是否为 2)。

使用函数重用工作代码并进行一些改进:

  • 您并不关心您检查的数字除以多少数字。一个数除以它就足够了,以使该数不是素数

  • 我们可以从 2 开始除法检查,数学证明只要上到数的平方根就足够了


from math import sqrt

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

然后将它与数字列表一起使用:

vector= [2, 3, 4, 5, 11, 15, 20]

for n in vector:
    if is_prime(n):
        print(n, 'is a prime')
    else:
        print(n, 'is not a prime')

输出

2 is a prime
3 is a prime
4 is not a prime
5 is a prime
11 is a prime
15 is not a prime
20 is not a prime

【讨论】:

  • 我想数数这个数能被整除多少次,因为如果大于2,这个数就不是质数,遵循“质数只有两个除法……”的想法此外,您的代码说数字 4 是素数
  • @carol 我明白这一点。关键是你不应该关心一个数字是否可以被 3 个数字或 4 个数字整除,以确定它是否是素数。该数字可以被 a 数字整除,该数字不是自身或 1(这就是为什么我们从 2 开始并以它的平方根结束)来宣布它是素数。关于4,见更新代码。使用int(sqrt(n)) + 1 作为range 的上限很重要(因为它在末尾是独占的)。
  • 是的,现在可以了。我在 youtube 上观看了一段视频,展示了素数的逻辑,我认为这是一个很好的学习解决素数列表的视频......显然不是......谢谢!
  • 此代码错误地声称 0 和 1 是素数。为了双倍的效率,让is_prime() 处理小于 2、2 本身和偶数作为函数开头的特殊情况,并从 3 开始循环仅对奇数。
【解决方案2】:

整数 x 的最大除数,肯定是 x//2 而不是 sqr(x) 而不是 sqrt(x)+1 ,这是数学

例如x=16,sqrt(x)=4,sqr(x)+1=5 但是 16 的最大除数是 8(真的是 16//2)

"""
verify prime or not in a list of number
"""

# my function :) 
def isPrime(x):
    """
    function get an integer as argument, and return True if this argument is prime and False if not
    """
    i = 2
    while i<=x//2 :
        if x%i != 0:
            i += 1
        else:
            return False
    return True 


# your code :) 
vetor = [2,3,4,5,11,15,20]

# for all elements e in vetor
for e in vetor:
    # test the return of isPrime function applied to arg e
    if isPrime(e):
        print("{} is prime number".format(e))
    else:
        print("{} is not prime number".format(e))

【讨论】:

  • 整数 x 的最大除数,肯定是 x//2 而不是 sqr(x) 而不是 sqr(x)+1 ,这是数学,例如 x=16, sqr(x) =4,但 16 的最大除数是 8(实际上是 16/2)
  • 此代码错误地声称 0 和 1 是素数。表达式i&lt;=x//2 有效但不是最优的。它的常用表达是i * i &lt;= x。对于平方根以上的每个除数,下面都有一个 - 我们只需要检查下面的除数和平方根本身。
【解决方案3】:

我相信问题比您尝试解决的问题要简单。你有大部分你需要的东西,但我们需要添加一些东西,扔一堆东西,然后重新排列一下:

vetor = [2, 3, 4, 5, 11, 15, 20]

def isprime():
    for number in vetor:
        if number < 2:
            print('The number {} is not prime'.format(number))
            continue

        i = 2

        while i * i <= number:
            if number % i == 0:
                print('The number {} is not prime'.format(number))
                break

            i += 1
        else:  # no break
            print('The number {} is prime'.format(number))

isprime()

其他答案包含的大部分附加代码都是关于效率的,还有很多东西需要学习。但是上面的代码已经足够了。

输出

> python3 test.py
The number 2 is prime
The number 3 is prime
The number 4 is not prime
The number 5 is prime
The number 11 is prime
The number 15 is not prime
The number 20 is not prime
>

我最喜欢包含在质数测试中的数字是 25,因为使用 &lt; 而不是 &lt;= 往往会将其变成质数!

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2015-04-11
    • 2019-02-23
    • 2022-11-29
    相关资源
    最近更新 更多