Палиндром -- это число, которое одинаково читается в обоих направлениях.
Наибольший палиндром, который может быть получен из произведения двух двузначных чисел, это 9009 = 90 * 91
Задание: Найти наибольший и наименьший палиндромы, которые могут быть получены из произведения двух трехначных чисел.
В лучших традициях Oracle решим её одним оператором SQL
Решение:
select S as PALINDROME, R1, R2
from (select R1, R2, S, trunc (mod (S, power (10, 6)) / power (10, 5)) as N6
, trunc (mod (S, power (10, 5)) / power (10, 4)) as N5
, trunc (mod (S, power (10, 4)) / power (10, 3)) as N4
, trunc (mod (S, power (10, 3)) / power (10, 2)) as N3
, trunc (mod (S, power (10, 2)) / power (10, 1)) as N2
, trunc (mod (S, power (10, 1)) / power (10, 0)) as N1
from (select R1, R2, R1 * R2 as S
from (select rownum + 99 as R1 from dual connect by level<=900)
, (select rownum + 99 as R2 from dual connect by level<=900)
where R1 >= R2
)
)
where ((S <= 99999 and N1 = N5 and N2 = N4)
or (S > 99999 and N1 = N6 and N2 = N5 and N3 = N4))
order by 1 desc
Наибольший: 906609 = 993 * 913
Наименьший: 10201 = 101 * 101
Время выполнения запроса -- 1 секунда
Найдём также палиндромы из произведения двух четырёхзначных чисел:
select S as PALINDROME, R1, R2
from (select R1, R2, S, trunc (mod (S, power (10, 8)) / power (10, 7)) as N8
, trunc (mod (S, power (10, 7)) / power (10, 6)) as N7
, trunc (mod (S, power (10, 6)) / power (10, 5)) as N6
, trunc (mod (S, power (10, 5)) / power (10, 4)) as N5
, trunc (mod (S, power (10, 4)) / power (10, 3)) as N4
, trunc (mod (S, power (10, 3)) / power (10, 2)) as N3
, trunc (mod (S, power (10, 2)) / power (10, 1)) as N2
, trunc (mod (S, power (10, 1)) / power (10, 0)) as N1
from (select R1, R2, R1 * R2 as S
from (select rownum + 999 as R1 from dual connect by level<=9000)
, (select rownum + 999 as R2 from dual connect by level<=9000)
where R1 >= R2
)
)
where ((S <= 9999999 and N1 = N7 and N2 = N6 and N3 = N5)
or (S > 9999999 and N1 = N8 and N2 = N7 and N3 = N6 and N4 = N5))
order by 1 desc
Наибольший: 99000099 = 9999 * 9901
Наименьший: 1002001 = 1001 * 1001
Время выполнения запроса -- 2 минуты
Если бы для решения был выбран процедурный подход, то время выполнения было бы нереально большим
Комментариев нет:
Отправить комментарий