Каталог решений - Запрос SQL для нахождения самого большого простого числа меньше заданного

Запрос SQL для нахождения самого большого простого числа меньше заданного

Запрос SQL для нахождения самого большого простого числа меньше заданного

В наличии

Данный запрос MS SQL демонстрирует некоторые возможности MS SQL Server, о которых часто неизвестно большинству программистов 1С. В тексте постараюсь объяснить интерес данного запроса (или скрипта).

Категория:

Описание

Когда я был студентом матфака, преподаватели несколько раз делали попытки вызвать интерес к простым числам, наиболее программируемым методом нахождения простых чисел является Решето Эратосфена. Этот метод сходится быстрее чем метод простого перебора, то есть является не линейным. Суть его заключается в исключении всех произведений чисел. Это даже был один из методов предлагаемых на лабораторной для реализации на любом языке, на матфаке не сильно принципиальны в этом плане (были в мое время). Когда я начал писать запросы на SQL, я сразу понял что этот язык как нельзя лучше подходит для этой задачи, но первый опыт был не удачным, хотя и нынешний бы забраковал принимающий препод(есть вопрос с оптимизацией), но для демонстрации подойдет.

Вспомнил я про Решето после очередного собеседования (это тоже было  8 лет назад), где в когда для того чтобы продемонстрировать навыки SQL, была предложена задача про шахматный турнир, типа есть таблица с участниками нужно составить расписание игр так, чтобы встречи игроков не повторялись (в результирующей таблице), то есть Иванов Петров, и Петров -Иванов — эта одна и та же встреча. Итак, решением этой задачи (баян!) было СОЕДИНЕНИЕ таблиц ПО полю(индекса) но не на РАВНО а на "<" либо ">", а что и так можно было(?), это сразу мне напомнило аксиомы из алгебры свойство коммуникативности: 2*3=3*2, получается если перемножать один раз количество операций умножения в запросе уменьшится вдвое.

Но основной проблемой было заполнение массива с членами умножения в запросе, можно использовать курсор (я его в принципе и использую), но какое содержание должно быть у запроса для открытия курсора, да никакого, курсор можно открыть даже в операторе присвоения, эта истина ко мне пришла тоже не сразу, ниже в запросе также я сделал несколько переменных для удобства, вторая таблица служит для небольшой оптимизации, хотя тоже неясно оптимизация это или нет, ведь для большого предельного числа память начнет использоваться активнее чем процессор в случае вложенного запроса. Итак, запрос (кстати можно находить не только максимально, но и все простые числа меньше или больше заданного):

declare @a int
declare @tab table(num int)
declare @tab2 table(num int)

declare @max_simple int
set @max_simple =10000 
 
declare cur cursor for 
select 2
OPEN cur
FETCH NEXT FROM cur INTO @a
WHILE @@Fetch_STATUS=0
BEGIN
	while @a<=@max_simple
	begin
		insert into @tab
		select @a as num
		set @a=@a+1
	end

	FETCH NEXT FROM cur INTO @a
  
END
CLOSE cur
DEALLOCATE cur

insert into @tab2
select t1.num* t2.num as num
from @tab as t1
left join @tab as t2 on t1.num <=t2.num
where t1.num* t2.num<=@max_simple


select max(t3.num)
from @tab as t3
where t3.num not in (select t4.num from @tab2 as t4)

  Кстати, у меня на слабеньком сервере для тестов число 9973 этим запросом нашлось за 1 минуту 50 секунд

has been added to your cart:
Оформление заказа