【问题标题】:Break in Boolean Loops打破布尔循环
【发布时间】:2021-02-12 03:54:56
【问题描述】:

我不知道我在挑战中做错了什么: 我需要在列表 nums 中找到素数并将它们返回到新列表中。有人能帮我吗!? 我的答案解决方案如下。

def find_primes(nums):
  
    lst = []
    prime = False
    for pr in range(2, nums + 1):
        prime = True
    
    for num in range(2, pr):
        if pr % num == 0:
            prime = False
            break
    
    if prime:
        lst.append(pr)
        
    return(lst)

【问题讨论】:

  • i % 1 == 0 的意思是“能被 1 整除的数”,这对所有整数都成立,而不仅仅是素数。
  • 你能格式化你的代码吗?看来您希望在第一个 for 循环中使用第二个 for 循环 for num in range(2, pr)
  • 看起来你只是对缩进有点粗心。

标签: python primes


【解决方案1】:

更pythonic的方式或实现它是使用python提供的filter函数..

In [6]: def isPrime(num):
   ...:     if num < 2:
   ...:         return False
   ...:     for x in range(2, num):
   ...:         if num % x == 0:
   ...:             return False
   ...:     else:
   ...:         return True
   ...:

In [7]: nums =  list(range(1, 100))

In [9]: list(filter(isPrime, nums))
Out[9]:

注意:isPrime 函数中的else 用于for loop

【讨论】:

    【解决方案2】:

    你可以用埃拉托色尼的筛子

    def find_primes(nums): 
        lst = [] 
        prime = [True] * (nums+1)
        for i in range(2, nums + 1): 
            if prime[i]:
                lst.append(i) 
                if i*i<=nums:
                    prime[i*i::i]=[False]*((nums-i*i)//i+1)
        return(lst)
    

    【讨论】:

    • 顺便说一句,筛分阶段可以进行到nums的平方根。对于平方根prime[i*i::i] 之后的所有i 将是空切片。超过公式中的(nums-i*i) 将是负数,因此您将有负长度列表,也许这在 Python 中是不允许的。
    【解决方案3】:

    我为您的算法find_primes() 提供了最少的修正以使其正常工作,您遇到的唯一问题是错误的缩进(行首的空格数错误)。

    我实现了一个更快的版本find_primes2(),它检查直到数字的平方根并且只检查赔率。

    然后是更快的版本find_primes3(),它检查直到平方根并且只检查当前素数列表中的除数。

    Try it online!

    def find_primes(nums):
        lst = []
        for pr in range(2, nums + 1):
            prime = True
    
            for num in range(2, pr):
                if pr % num == 0:
                    prime = False
                    break
    
            if prime:
                lst.append(pr)
                
        return(lst)
    
    print(find_primes(123))
    
    def find_primes2(nums):
        import math
        if nums < 2:
            return []
        lst = []
        for pr in range(3, nums + 1, 2):
            prime = True
    
            for num in range(3, math.floor(math.sqrt(pr) + 0.1) + 1, 2):
                if pr % num == 0:
                    prime = False
                    break
    
            if prime:
                lst.append(pr)
                
        return([2] + lst)
    
    print(find_primes2(123))
    
    def find_primes3(nums):
        import math
        if nums < 2:
            return []
        lst = [2]
        for pr in range(3, nums + 1, 2):
            prime = True
    
            limit = math.floor(math.sqrt(pr) + 0.1)
            for num in lst:
                if num > limit:
                    break
                if pr % num == 0:
                    prime = False
                    break
    
            if prime:
                lst.append(pr)
                
        return(lst)
    
    print(find_primes3(123))
    

    输出:

    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
        61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
        61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
        61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
    

    【讨论】:

      【解决方案4】:

      有一些错误。这是更正后的代码:

      def prime_number(nums):
      lst= nums
      lst2=[]
      
      for pr in range(0,len(lst)):
          if lst[pr]>1:
              flag = 0
              for i in range(2,lst[pr]-1):
                  if (lst[pr]%i)==0:
                      flag=1
                      break
      
              if(flag==0):
                  lst2.append(lst[pr])
      
      return lst2
      
      list=[3,10,7,17,6,45,13]
      prime_list= prime_number(list)
      print(prime_list)
      

      【讨论】:

      • for 循环中的 else 部分违背了 for 循环的全部目的。循环不会执行多次。这里的逻辑不正确。。
      • 您好,感谢您的纠正。我添加了一个新的答案。评论真的很有帮助。
      • @TahilBansal 顺便说一句,您可以单击答案下方的Edit 按钮,然后通过更正修改您当前的答案,而不是创建新答案。
      • 我已对现有答案进行了更改
      猜你喜欢
      • 2013-03-02
      • 2021-03-11
      • 2018-02-28
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      相关资源
      最近更新 更多