【问题标题】:isPrime function (list + % operator)isPrime 函数(列表 + % 运算符)
【发布时间】:2016-01-19 20:47:31
【问题描述】:

我正在尝试获取一个函数来确定 N 是否为质数。我是 Python 新手,我知道这可能不是解决这个问题的最有效方法,但这是我的尝试

def is_prime(N):
    k = []                                     #Creates a new list k
    for i in range(2,N):                       #For each i from 2 -> N
        r = N%i                                # r is the remainder of N % i
        k.append(r)                            # appends each remainder r to list k

        if (i == N-1):                         #Once index equals N-1, print list k
            print(k)           

        #For each element j in list k, check if each element in list k is 0
            for j in range (len(k)):        
                if k[j] != 0:             <---PROBLEM
                    return True
                else:
                    return False
print(is_prime(15))

我的逻辑是,当一个数可以被 1 和它自己整除,并且不能被从 2 到 N-1 的任何其他数整除时,它就是质数。在上面的代码中,我在比较列表 k 中每个元素的值时遇到了问题。我想确定每个元素 k[j] == 0 的值。如果每个元素 k[j] != 0 and N%1 == 0 and N%N == 0,则为素数!

关于如何解决这个问题的任何想法?请参阅下面的链接以获取我的代码的可视化! http://goo.gl/IVIRz7

【问题讨论】:

  • 如果您在列表中添加可整除的数字,为什么您不在 len 列表中尝试条件,为什么要在其中检查?
  • @Arman 我不太明白你的意思。我正在检查列表内部,因为我想知道其中每个元素的值是否为 0。
  • 看我的回答,你应该只检查列表长度
  • @Arman TypeError: 'float' 对象不能解释为整数。我尝试添加 int(N/2) 但这没有意义。
  • 你可以换成N

标签: python algorithm python-3.x primes


【解决方案1】:

我建议如下解决:

def is_prime(n):
    i = 2
    while (i * i <= n):
        if (n % i == 0):
            return False
        i += 1
    return True

此代码适用于n &gt;= 2

【讨论】:

  • 你可以通过不检查i > 2的任何偶数值来做得更好。
  • 您能解释一下使用 i*i 背后的逻辑吗?我想我知道你为什么这样做,但只是想听听你的意见。谢谢!
  • @misheekoh: 如果 ab == N,那么 ab 中至少有一个必须是 a
  • 如果数字in的除数,那么n/i也是一个除数。这两个除数之一小于或等于√ n。如果不是这样,n 将是两个大于 √ n 的数字的乘积。
  • @mabe02:如果您明确检查 N 是否为偶数,然后将 i 初始化为 3 并在每次迭代中将其递增 2,您(大致)将迭代次数减半。
【解决方案2】:
import math

def is_prime(n):
    i = 3
    while (i <= math.sqrt(n)):
        if (n % i == 0):
            return False
        i += 2
    return True

这是最好的。上面的每个人都提到了它的变化。

【讨论】:

    【解决方案3】:

    上面的答案会起作用,但我想我会解释你的逻辑错误。您用英语的推理是合理的,因为如果 [2,N-1] 之间的任何数字将 N 整除,那么您就找到了一个非质数。

        for j in range (len(k)):        
            if k[j] != 0:             
                return True
            else:
                return False
    

    这个循环实际上检查的是 k 中的 first 数字是否为 0。如果它不为零,则该数不会整除 N(请注意,这并不意味着其他数会整除 n),因此该数仍然可能是素数,但前提是余数是其余潜在除数的非零值。换句话说,只要看到余数为 0,您就可以返回 False,但只有当 所有 除数的余数都非零时,才能返回 True。

    固定:

            for j in range (len(k)):        
                if k[j] == 0:
                    return False
                return True 
    

    return True 语句只有在我们设法让它一直通过循环而不返回 False 时才会执行。

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 2012-03-13
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多