Вывод простых чисел на Oracle
Задача с Hackerrankopen in new window:
Напишите запрос выводящий простые числа меньшие или равные 1000.
Пример вывода постых чисел меньших или равных 10:
2&3&5&7
1
Решение
Разложим задачу на подзадачи:
- Вывести список чисел от 2 до 1000
- Отфильтровать из списка только простые числа
- Объединить результат в одну строку
Для вывода списка чисел воспользуемся connect by
select
level + 1 n
from
dual
connect by
level <= 999
1
2
3
4
5
6
2
3
4
5
6
В результате появляется список строк с числами от 2 до 1000. Теперь нужно оставить только простые числа. Простые числа делятся только на единицу и на самих себя. Проверим это с помощью подзапроса. Так как в подзапросе понадобится тот же список чисел то вынесем его в with
:
with nums as
(select
level + 1 n
from
dual
connect by
level <= 999)
select * from nums
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
И добавим подзапрос:
with nums as
(select
level + 1 n
from
dual
connect by
level <= 999)
select
*
from
nums n1
where
not exists (select
*
from
nums n2
where
n2.n <> n1.n
and mod(n1.n, n2.n) = 0
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Теперь осталось только соединить строки в одну. Для этого воспользуемся функцией listagg
:
with nums as
(select
level + 1 n
from
dual
connect by
level <= 999)
select
listagg(n, '&') within group (order by n) n
from
nums n1
where
not exists (select
*
from
nums n2
where
n2.n <> n1.n
and mod(n1.n, n2.n) = 0
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
В результате получаем:
2&3&5&7&11&13&17&19&23&29&31&37&41&43&47&53&59&61&67&71&73&79&83&89&97&101&103&107&109&113&127&131&137&139&149&151&157&163&167&173&179&181&191&193&197&199&211&223&227&229&233&239&241&251&257&263&269&271&277&281&283&293&307&311&313&317&331&337&347&349&353&359&367&373&379&383&389&397&401&409&419&421&431&433&439&443&449&457&461&463&467&479&487&491&499&503&509&521&523&541&547&557&563&569&571&577&587&593&599&601&607&613&617&619&631&641&643&647&653&659&661&673&677&683&691&701&709&719&727&733&739&743&751&757&761&769&773&787&797&809&811&821&823&827&829&839&853&857&859&863&877&881&883&887&907&911&919&929&937&941&947&953&967&971&977&983&991&997
1