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

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.

Autor: xpil

Po czterdziestce. Żonaty. Dzieciaty. Komputerowiec. Krwiodawca. Emigrant. Rusofil. Lemofil. Sarkastyczny. Uparty. Mól książkowy. Ateista. Apolityczny. Nie oglądam TV. Uwielbiam matematykę. Walę prosto z mostu. Gram na paru instrumentach. Lubię planszówki. Słucham bluesa, poezji śpiewanej i kapel a’capella. || Kliknij tutaj po więcej szczegółów ||

Dodaj komentarz

Bądź pierwszy!

Powiadom o
avatar
wpDiscuz