【问题标题】:Python finding Prime Numbers between any two numbersPython 查找任意两个数之间的质数
【发布时间】:2016-07-15 21:09:15
【问题描述】:

我试图找出任意两个随机数之间的素数。

首先,我编写了如下代码:

m,n = map(int, raw_input().split())
for i in range(m, n+1):
    for j in range(2, i):
        if i%j == 0:
            break
    else:
        print i,

现在对于测试用例假设我输入 2, 30 然后它会打印出来

2 3 5 7 11 13 17 19 23 29

现在分析,我们不需要在第二个循环中循环到“i”,而是可以通过循环到 i/2 来做同样的事情,然后我将代码更改为:

m,n = map(int, raw_input().split())
for i in range(m, n+1):
    for j in range(2, int(i/2)+1):
        if i%j == 0:
            break
    else:
        print i,

然后我们在第二个循环中循环到 i/2 时,结果与上面相同。

现在,我正在尝试使用 Eratosthenes 筛法打印素数,我使用的代码如下:

m,n = map(int, raw_input().split())
for i in range(m, n+1):
    sqrt_num = int(n**(0.5))
    for j in range(2, sqrt_num+1):
        if i%j == 0:
            break
    else:
        print i,

但它会打印出来

7 11 13 17 19 23 29

对于相同的输入。

请帮助我理解我做错了什么。以及如何使用这种方法完成同样的任务。

【问题讨论】:

  • 您是否在 [24..28] 这样的数字范围内测试过您的代码?
  • 是的,它不打印任何数字,因为 [24..28] 中没有素数。

标签: python primes sieve-of-eratosthenes


【解决方案1】:

您的内部循环过去一直循环到i-1i/2。当i 变小时,这个内循环很短,当i 变大时,这个内循环变长。

现在,您的内部循环上升到 sqrt_num,这是从 n 计算得出的常数。行为差异。

考虑i = 3,内部循环从j = 2 运行到j = 5,并且会发现i%j == 0 的情况...特别是j == 3 时。


要明确:问题是“sqrt_num,它是一个常数”。将其更改为外部索引的平方根,i

    sqrt_num = int(i**(0.5))

【讨论】:

  • 是的,你是对的,但我怎样才能按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2015-10-24
  • 2017-07-20
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多