我正在尝试编写一个素数筛生成器,我将其转换为打印列表,然后在给定范围内打印素数。我很确定我的配对数是正确的,但出于某种原因,我在素数列表中得到了一些非素数的额外值。(我马上发现了这一点,因为我在输出中的最后一个值是3599,这不是素数)。我不确定我是否有某种逻辑错误,所以任何帮助都很棒。
def sieve(n):
a = [True] * (n)
a[0] = a[1] = False
for (i, isPrime) in enumerate(a):
if isPrime:
yield i
for n in range(i*i, n, i):
a[n] = False
def pairs(li):
pair = 0
for i, x in enumerate(li):
if i < len(li)-1:
if li[i] + 2 == li[i+1]:
pair += 1
return pair
p_3600 = list(sieve(3600))
ans = [vals for vals in p_3600 if vals > 1600]
print ans
print "pairs:", pairs(ans)
您的筛选功能不正确。您将所有数字标记为非素数,从“2”开始。你需要从素数的下一个倍数开始,即prime*prime
因此,你必须从
i * i
而不是i
开始(我使用了i * 2
,它有效但冗余,因为当i==2
时已经被第一个循环覆盖)
def sieve(n):
a = [True] * n
a[0] = a[1] = False
for (i, isPrime) in enumerate(a):
if isPrime:
yield i
for j in range(i*i, n, i):
a[j] = False
为了测试你的列表,我建议你添加一个质数测试,这样你就可以确定:
# make sure it works: time-costly but reassuring
import math
for i in ans:
si = int(math.sqrt(i))+1
for j in range(2,si):
if i%j==0:
raise Exception("%d is not prime (%d)" % (i,j))
假设我有一个范围(section)和一个额外的要排除的范围列表,由元组(start,end)表示: 我正在寻找一种有效的算法,从这两个输入中返回一个新的范围列表,如: 这是引出第二个范围列表的主范围。 谢啦! 编辑: 实际上,deceze关于使用intervaltree的建议似乎很有趣。有几行: 显然,间隔被视为已关闭,但这是一个小问题。
对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时
我想为一些地图实现编写一个基准测试,包括一个自定义实现。我想测试它在广泛的输入范围内的平均行为。 因为这是我第一次使用JMH,所以使用@Param看起来是显而易见的选择。但事实证明,JMH不会在一个基准测试中使用所有这些不同的输入,而是会为每一组参数运行单独的基准测试。 是否有一些我缺少的功能,或者只是在我的基准测试中循环输入的范围,这是正确的做法? 更新: 我实现了2个不同的基准,给出了完全相反
在应用程序脚本中是否有一种简单的方法可以查找某个范围内的下一个空行,例如,我希望如下所示: 返回B2:D范围内的下一行空行,以便返回第4行 其他行(如A行 我正在尝试从另一个工作表(或选项卡)写入下一个空行,该工作表有一个供用户输入数据的输入区域,然后点击按钮,数据将添加到目标页上的空行(数据的第一行!B2:D)
因此,我一直在寻找一个函数,该函数需要2个参数,一个低值和一个高值(均为64位整数),而不是在这些范围之间生成一个随机数。我一直遇到的问题是,这个数字不是64位int,或者边缘的数字比中间的数字更常见。 这是一些代码:它只是一直返回-1或0…
任何解决这个问题的帮助都是感激的。 谢谢 ====根据收到的答案修改。====