素数生成器不工作

2024-09-23 22:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是:

  • 创建奇数的“列表”
  • 然后测试它们是否为素数 测试将以奇数的一半的倍数进行,因此是半奇数
  • 把素数放入一个表中
  • 打印那个列表

然而,我的结果是一个从1到1003的数字列表,它跳过了3、4和5

这里有语义错误吗?你知道吗

#Prime number generator 

def primenumber():
    primelist = [1, 2]
    num = 3
    even = num%2
    multi = 0
    result = 0
    while len(primelist) < 1000:
        if even != 0:
            oddnum = num
        i = 2
        halfodd = ((oddnum + 1)/2)
        while i < halfodd:
            i =+ 1
            multi = oddnum%i
            if multi == 0:
                result += 1
        if result != 0:
            primelist.append(oddnum)
            prime_num = oddnum
        num += 1
    print primelist

primenumber() 

Tags: 列表if数字resultmultinum素数even
2条回答

这应该起作用:

def primenumber():
  primelist = [1, 2]
  candidate = 3
  while len(primelist) < 1000:
    isCandidatePrime = True
    if (candidate % 2 == 0): # if candidate is even, not a prime
      isCandidatePrime = False
    else:
      for i in range(3, (candidate+1)/2, 2): # else check odds up to 1/2 candidate
        if (candidate % i == 0): # if i divides it, not a prime
          isCandidatePrime = False
          break
    if (isCandidatePrime):
      primelist.append(candidate)
    candidate += 1
  print primelist

我认为有几个改进(只检查小于或等于候选数平方根的数字,只检查素数,而不是所有小于候选数平方根的数字),但我暂时不谈这些。你知道吗

if result != 0:

因为result是(应该是)你发现了多少因子的计数,所以你需要

if result == 0:

当你前进到一个新的候选素数时,你也不会重置result,你永远不会重新计算even,如果你这样做了,你会考虑两次奇数。你知道吗

相关问题 更多 >