如何打印给定范围内的素数 | 甲骨文 19c |

yyy*_*103 1 sql oracle primes

我一直在尝试编写一个逻辑打印所有素数

它按预期工作,直到范围为 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)

我的输出范围 1100

输出

小智 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 更改了论坛平台提供商,该内容变得难以阅读。