打印小于 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
每次a
被i
整除,然后递增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
我是编程新手,正在尝试编写一个打印小于 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
每次a
被i
整除,然后递增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