我正在尝试在任意两个随机数之间找到素数。
首先,我编写了如下代码:
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。
现在,我正在尝试使用Sierat of 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
输入相同的内容。
请帮助我理解我做错了什么。以及如何使用这种方法完成同样的工作。
答案 0 :(得分:2)
您的内部循环用于循环直到i-1
或i/2
。 <{1}}较小时内圈较短,i
较大时较长。
现在,你的内部循环上升到i
,这是一个从sqrt_num
计算的常量。行为上的差异。
考虑n
,内部循环从i = 3
运行到j = 2
,并且会找到j = 5
...具体地说,i%j == 0
时的情况。
要明确:问题是&#34; j == 3
,这是一个常数&#34;。将其更改为外部索引的平方根sqrt_num
。
i