我一直在尝试编写一个逻辑来打印所有素数。
它按预期工作,直到范围为 1to 100。
但是当我增加范围时,它不起作用1500
有人可以详细解释我下面的代码有什么问题以及如何改进吗?
任何简单或不同的方式来打印素数将不胜感激
代码 :
SELECT
result
FROM
(
SELECT
CASE
WHEN ROWNUM = 2 THEN
ROWNUM
WHEN ROWNUM = 3 THEN
ROWNUM
WHEN ROWNUM = 5 THEN
ROWNUM
END AS result
FROM
dual
CONNECT BY
ROWNUM <= 5
)
WHERE
result IS NOT NULL
UNION ALL
SELECT
result
FROM
(
SELECT
decr1 AS result
FROM
(
SELECT
rn AS decr1
FROM
(
SELECT
ROWNUM AS rn
FROM
dual
CONNECT BY
ROWNUM < 1000
)
)
WHERE
decr1 > 5
MINUS
SELECT
decr AS result
FROM
(
SELECT
t.rn AS decr
FROM
(
SELECT
ROWNUM AS rn
FROM
dual
CONNECT BY
ROWNUM < 1000
) t
WHERE
rn >= 6
)
WHERE
mod(decr, 2) = 0
OR mod(decr, 3) = 0
OR mod(decr, 4) = 0
OR mod(decr, 5) = 0
OR mod(decr, 6) = 0
OR mod(decr, 7) = 0
OR mod(decr, 8) = 0
OR mod(decr, 9) = 0
OR mod(decr, 10) = 0
);
Run Code Online (Sandbox Code Playgroud)
我的输出范围 1为100
小智 5
如果一个正整数严格大于 1,并且不能被除 1 和该数字本身之外的任何正整数整除,则该正整数是素数。要检查素数,只需知道该数字是否可以被 2 到 trunc(sqrt(that_number)) 之间的数字整除即可。在代码中:
with
user_input (n) as (
select :n -- user input goes here
from dual
)
, candidates (p) as (
select level
from user_input
where level > 1
connect by level <= n
)
, prep (f) as (
select level
from dual
where level > 1
connect by level <= trunc(sqrt(:n))
)
select p as prime
from candidates
where not exists (
select f
from prep
where f <= trunc(sqrt(p))
and
mod(p, f) = 0
)
;
Run Code Online (Sandbox Code Playgroud)
输入(在查询顶部的子句中with)是一个绑定变量,您可以将其设置为 100 或任何您需要的值。
注意:例如,如果您需要 100,000 以内的所有素数,这将非常慢(在我的机器上需要 2.3 秒)。甚至不要尝试达到 100 万或更多。对于这些,您需要更好的算法。我们小学时都学过埃拉托斯特尼筛算法;这对于使用过程语言(例如 PL/SQL)编写代码来说是微不足道的,而对于声明性语言(例如 SQL - 证明“声明性”只是一个营销词,也许是一个理想,但不是现实)来说就不那么容易了。有关相当长的讨论,请参阅https://community.oracle.com/tech/developers/discussion/3931268/sql-puzzle-prime-numbers/p1 ,几年前 Oracle 更改了论坛平台提供商,该内容变得难以阅读。