Pchełki SQL, odcinek 17: mnożymy palindromicznie

https://xpil.eu/gRWwH

Dziś pokażę w jaki sposób za pomocą jednego zapytania SQL rozwiązać stosunkowo nietrudną zagadkę matematyczną.

Zagadka brzmi: czy istnieje taka liczba naturalna czterocyfrowa N, która po przemnożeniu przez pewną liczbę naturalną X da w wyniku liczbę składającą się z tych samych cyfr co N, ale ustawionych w odwrotnej kolejności?
Jeżeli tak, podaj tę liczbę.

Jak wieloletni numeryk (krzyżówka choleryka z numerologiem) mogę podać z pamięci przynajmniej jedno rozwiązanie tej zagadki: 1089. 1089 * 9 = 9081. Jednak nie wiem, czy istnieją inne takie liczby, a ponieważ niewiedza ta nie pozwala mi spokojnie spać w nocy, spróbuję to sprawdzić za pomocą komputera.

Jak już wiele razy wpominałem, SQL nadaje się do tego typu zadań raczej słabo, na szczęście w tym konkretnym przypadku mamy do czynienia z liczbami zaledwie czterocyfrowymi, a więc zbiór do przeszukania będzie miał nie więcej niż 9000 elementów. To chyba nie za dużo. Spróbujmy:

WITH cte_ord AS (
    SELECT 0 n
    UNION ALL SELECT n + 1
    FROM cte_ord
    WHERE n < 9  )
, cte_10k AS (
    SELECT ord1.n + ord2.n * 10 + ord3.n * 100 + ord4.n * 1000 n    
    FROM cte_ord ord1, cte_ord ord2, cte_ord ord3, cte_ord ord4 )
SELECT convert(varchar(4), cte_10k.n) + ' * ' + convert(varchar(1), cte_ord.n) + ' = ' + convert(varchar(4), cte_10k.n * cte_ord.n)
FROM cte_10k, cte_ord
WHERE cte_ord.n > 1
    AND cte_10k.n > 999
    AND cte_10k.n * cte_ord.n = REVERSE(cte_10k.n);

Powyższe zapytanie daje w wyniku:

2178 * 4 = 8712
1089 * 9 = 9801

Jak widać, są dwie takie liczby, które spełniają warunki zagadki: znana już wcześniej 1089 oraz nowy gracz na ringu: 2178. Faktycznie, 2178 przemnożone przez cztery daje 8712, czyli swój własny palindrom.

Z rozwiązania usuwamy przypadki trywialne, czyli mnożenie przez jeden (dowolna liczba będąca własnym palindromem spełni warunki zadania przy mnożeniu przez jedynkę, np. 4554 * 1 = 4554 itd.)

Znalezienie rozwiązania dla liczb pięciocyfrowych pozostawiam na deser Czytelnikowi.

https://xpil.eu/gRWwH

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.