打印小于 100 的素数?

Printing primes less than 100?

我是编程新手,正在尝试编写一个打印小于 100 的素数的程序。当我运行我的程序时,我得到的输出包含大部分素数,但我也有偶数和随机奇数.这是我的代码:


a=1
while a<100:
    if a%2 == 0:
        a+=1
    else:
        for i in range(2,int(a**.5)+1):
            if a%i != 0:
                print a
                a+=1
            else:
                a+=1

我的代码的第一部分旨在消除所有偶数(似乎没有完全起作用)。我也没有完全理解我的代码部分(for i in)。

代码的 "for i in" 部分究竟做了什么?什么是 'i'?

我如何修改我的代码,使其能够准确地找到 1-100 之间的所有素数?

提前致谢。

查看您 post 上的评论,了解您的代码为何不起作用。我只是来修复您的代码。


首先,利用函数。它们使代码更具可读性。在这种情况下,检查数字是否为质数的函数将是一个好主意。

from math import sqrt

def is_prime(number):
    return all(number%i for i in range(2, int(sqrt(number))+1))

现在没有什么可做的了 - 您只需要计算您找到了多少个素数,以及一个不断增长的数字:

primes= 0
number= 1
while primes<100:
    if is_prime(number):
        print number
        primes+= 1
    number+= 1 # or += 2 for more speed.

突然间阅读和调试变得非常容易,不是吗?

我将尝试在不提供任何代码的情况下指导您来帮助您学习,我认为您可能应该从头开始,并确保您了解代码的每一部分是如何工作的。

关于质数的一些事情,1 不是质数而 2 是,所以如果你想消除偶数,你应该从 a=3 开始并立即打印 2。

这样,您就可以将 a 递增 2 而不是像现在这样递增 1,然后跳过偶数。

当您循环 a 使其小于 100 时,您需要检查 a 的每个值是否为素数,方法是使用另一个变量进行另一个循环,该变量向下循环遍历所有可能除以 a(小于或等于a 的平方根)。如果该变量整除 a,则退出内部循环并递增 a,但如果它一直到 1,则 a 是质数,您应该打印它,然后递增 a。

你在这里做的有几处错误:

  • 你没有找到前 100 个质数,你找到小于 100 的质数 while a < 100
  • print a每次ai整除,然后递增a。但是你已经超前了! a 仅当它不能被 任何 i 整除时才是质数,但您无法跟踪它是否因任何 i 而失败。
  • 您将 +1 添加到数字的平方根范围内 - 但这不是必需的。数字的平方根是可能是两个因素中较小者的最大数字。您不需要加 1,因为该数字比平方根大 _bigger - 换句话说,如果 a 被 sqrt(a)+1 整除,则 a / (sqrt(a)+1) 将小于sqrt(a)+1 和 therfore 应该已经找到了。
  • 你从不打印你找到的素数列表;你 print a 每次你找到一个不是因数的数字(素数除了一个和它们本身之外没有 没有 个因数,所以你根本没有打印素数!)

这可能会让您朝着正确的方向思考:

a=0
primes = []
while len(primes) < 100:
  a = a + 1
  prime=True
  maxfactor = int(a ** .5)
  for i in primes:
    if i == 1:
      continue
    if i > maxfactor:
      break
    if a % i == 0:
      print a, " is not prime because it is evenly divisble by ", i
      prime=False
      break
  if prime:
    print "Prime number: ", a
    primes.append(a)
for p in primes:
    print p