【问题标题】:Finding the sum of primes below 10求10以下的素数之和
【发布时间】:2015-07-08 08:17:19
【问题描述】:
>>> k=1
>>> sum=0
>>> for i in range (2,10):
        for j in range (2,i):
            if ((i%j)==0):
                k=0
    if (k==1):
        sum+=i


>>> print(sum)
    5

我不知道为什么,但是这段代码总是给出 5,而不是输出 17。

【问题讨论】:

  • 您只需要检查到i/2
  • @pala_:实际上是i 的平方根。

标签: python-3.x primes


【解决方案1】:

每次for i 循环移动到下一个数字时,您都需要将k 标志设置回1

for i in range (2,10):
    k = 1
    for j in range (2,i):
        if ((i%j)==0):
            k=0
    if (k==1):
        sum+=i

如果不这样做,您的代码只会发现 5 是一个素数,并忽略之后的任何内容。

请注意,在 Python 中,当用于布尔上下文(例如 if 语句)时,0 被视为 false,1 为 true,因此您可以只使用 if k:。更好的是,使用TrueFalse 以及更好的变量名,例如is_prime 而不是k。你可以去掉很多括号:

sum = 0
for num in range (2, 10):
    is_prime = True
    for i in range (2, int(num ** 0.5) + 1):
        if not num % i:
            is_prime = False
    if is_prime:
        sum += num

我还利用了这样一个事实,即您只需要检查一个数字的平方根即可查看是否有除数,从而大大减少了循环。

最后但同样重要的是,您可以使用for ... else 构造;如果你在for 循环中使用breakelse 分支永远不会被执行,但如果for 循环完成到最后没有中断,它;这消除了对布尔标志的需要:

sum = 0
for num in range (2, 10):
    for i in range (2, int(num ** 0.5) + 1):
        if not num % i:
            break
    else:
        sum += num

【讨论】:

  • 很好的答案,新版主先生
  • 谢谢!你的回答有帮助。
  • 如果我需要找到一个非常大的数(例如一百万)以下的素数总和,我该怎么办?在对“k”变量进行更改后,我的代码在这种情况下不起作用。
  • @sbhayana26:使用此方法查找所有最多 100 万个素数需要一点时间。如果您使用我的方法(仅测试平方根),它会快一点。总和是 37550402023,它工作得很好。有faster ways still使用筛子。
【解决方案2】:
sum=0
limit=10
for n in range(2,limit+1):
  if all(n % i for i in range(2, n)):
    sum += n
print sum

Output: 17

【讨论】:

    【解决方案3】:

    除了@Martijn Pieters 的回答,您可以在sum 中使用generator expression

    >>> sum(i for i in range(2,10) if all(i%j!=0 for j in range(2,i)))
    17
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多