在Julia和Python中比较给定的两个数字之间的素数



请参阅Python代码,以查找给定的上下两个数字之间的素数:

lower = 3
upper = 15
print("Prime numbers between", lower, "and", upper, "are:")
for num in range(lower, upper + 1):
for i in range(2, num):
if (num % i) == 0:
break
else:
print(num)

Python输出:

Prime numbers between 3 and 15 are:
3
5
7
11
13

Julia中几乎相似的代码给出了错误的输出。请参阅下面的Julia代码:

lower = 3
upper = 15
println("Prime numbers between ", lower, " and “, upper, " are:”)
for num in lower:upper    
for i in 2: num-1
if (num % i) == 0
break           
else
println(num)
break
end
end
end

Julia输出:

Prime numbers between 3 and 15 are:
3
5
7
9
11
13
15

显然,9和15不是素数。为什么Python代码给出了正确的输出,而Julia代码却没有。有没有办法用同样的算法逻辑来修复它?

以下是我将使用的代码,它可以根据您的请求保持相同的算法逻辑(我这样写代码,因为循环内的条件不仅有效,而且读起来很自然:"2:num-1除以num的范围中的任何一个数字,或者打印num"(:

julia> lower = 3
3
julia> upper = 15
15
julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:
julia> for num in lower:upper
any(i -> num % i == 0, 2:num-1) || println(num)
end
3
5
7
11
13

根据Julia中对您问题的评论,您在for循环中没有else子句。然而,使用any函数可以保持与代码相同的逻辑,因为它是一个短路函数(在for循环中实现与break相同的效果(。

如果我的代码中有什么不清楚的地方,请告诉我。


编辑:

我将重写代码来解释它是如何工作的。

首先是||部分。它利用了||算子的短路行为。因此,在第一级上,这可以重写为:

julia> lower = 3
3
julia> upper = 15
15
julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:
julia> for num in lower:upper
iscomposite = any(i -> num % i == 0, 2:num-1)
if !iscomposite
println(num)
end
end
3
5
7
11
13

现在,正如所评论的,any也在做短路,所以它相当于写:

julia> lower = 3
3
julia> upper = 15
15
julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:
julia> for num in lower:upper
iscomposite = false
for i in 2:num-1
if num % i == 0
iscomposite = true
break
end
end
if !iscomposite
println(num)
end
end
3
5
7
11
13

您的Julia代码似乎在内部打印并打破因子检查循环,而不是等待所有因子得到验证。(我不认识朱莉娅,但这似乎是一个明显的区别(。

相关内容

最新更新