质数:为什么此代码给我一些复合数字

  • 本文关键字:复合 数字 代码 质数 python
  • 更新时间 :
  • 英文 :


我似乎正在获得所有质量数,但是一些复合数字也出现了。为什么?

p=[2,]
while len(p)<35:
        next = p[-1]+1
        for i in range(len(p)):
            if next%p[i]==0:
                next+=1
                i=0
        p.append(next)
print p     

这是我得到的输出:

[2,3,5,7,11,13,16,17,17,23,27,27,29,35,37,37,41,43,47,47,50,50,53,59,59,61,6167、71、73、77、79、83、87、89、95、97、101、103]

,因为当您在for循环中更新 next时,您从素数列表的开始就没有扫描,而无法检查新的next是否可分开。您可以尝试以下方式。

p=[2,]
number=3
while len(p)<35:
    if all(number%i!=0 for i in p):
        p.append(number)
    number += 1
print p    

如果在每次迭代中打印i的值,您将看到问题。i的值将继续增加。

测试3除以2(P [0])测试4除以2(p [0])测试5除以3(p [1])测试6除以2(p [0])测试7除以3(p [1])测试7除以5(p [2])测试8除以2(p [0])测试9除以3(p [1])测试10除以5(p [2])测试11除以7(p [3])测试12除以2(p [0])测试13除以3(p [1])测试13除以5(p [2])测试13除以7(p [3])测试13除以11(p [4])测试14除以2(p [0])测试15除以3(p [1])测试16除以5(p [2])测试16除以7(p [3])测试16除以11(p [4])测试16除以13(p [5])测试17除以2(p [0])

每次代码评估行for i in range(len(p))时,它都不考虑i的当前值,因为range(len(p))实际上是列表(或Python 3中的生成器),因此仅迭代列表,实际上不做i = i+1正如您所期望的。

例如,考虑len(p)=3时的情况。那么range(len(p))等于[0,1,2]。FO循环将首先采用值0。然后,下一个迭代将具有 1的值,第三个迭代将具有2的值,无论您对循环主体内i的值做什么。

一种解决方案不是使用for i in range(len(p)),而是自己进行迭代:

next = p[-1]+1 # actually you can do next = next+1
i = 0
while i < len(p):
    if next%p[i]==0:
        next += 1
        i=0
    else:
        i+=1
p.append(next)

最新更新