This challenge is to test the logical ability and does not have any resemblance with real time problem. The task is to generate the palindrome primes from 10 to 1000 and count the number of occurrences of each digit in them
A number that reads the same from left to right and vice versa is a palindrome number, for example 121 or 65456. Primes numbers are those that are divisible only by 1 and the number itself, for example 2 or 5.
- Sample Data
- Expected Results
PalindromPrimes 0 1 2 3 4 5 6 7 8 9 --------------- -- -- -- -- -- -- -- -- -- -- 11 - 2 - - - - - - - - 101 1 2 - - - - - - - - 131 - 2 - 1 - - - - - - 151 - 2 - - - 1 - - - - 181 - 2 - - - - - - 1 - 191 - 2 - - - - - - - 1 313 - 1 - 2 - - - - - - 353 - - - 2 - 1 - - - - 373 - - - 2 - - - 1 - - 383 - - - 2 - - - - 1 - 727 - - 1 - - - - 2 - - 757 - - - - - 1 - 2 - - 787 - - - - - - - 2 1 - 797 - - - - - - - 2 - 1 919 - 1 - - - - - - - 2 929 - - 1 - - - - - - 211 is a palindrome prime number and hence it is listed in the output. 11 has the number "1" twice and therefore the column "1" shows 2. Another palindrome prime, "101" has one zero and two ones. That is why the column "0" shows 1 and the column "1" shows 2.
- Rules
- The code should run in SQL SERVER 2005 and later versions.
- The code should generate the palindrome prime numbers. It should not read from a static table/cte/view.
- Output should be sorted by the first column(Palindrome Primes) in ascending order.
- 個人解法
;
WITH Number AS
(
SELECT 1 AS Number
UNION ALL
SELECT Number + 1
FROM Number
WHERE Number < 1000
)
,
CTE AS
(
SELECT Number , 1 AS Location
FROM Number
WHERE CAST(Number AS varchar(4)) = REVERSE(CAST(Number AS varchar(4))) -- 判斷回文
AND Number > 10 -- 根據題目只計算 10 至 1000 之間的回文質數
UNION ALL
SELECT NumBer , Location + 1
FROM CTE
WHERE Location < LEN(CAST(Number AS varchar(4)))
)
SELECT
Number AS PalindromPrimes ,
ISNULL(NULLIF(CAST([0] AS varchar(1)),'0'),'-') AS [0],
ISNULL(NULLIF(CAST([1] AS varchar(1)),'0'),'-') AS [1],
ISNULL(NULLIF(CAST([2] AS varchar(1)),'0'),'-') AS [2],
ISNULL(NULLIF(CAST([3] AS varchar(1)),'0'),'-') AS [3],
ISNULL(NULLIF(CAST([4] AS varchar(1)),'0'),'-') AS [4],
ISNULL(NULLIF(CAST([5] AS varchar(1)),'0'),'-') AS [5],
ISNULL(NULLIF(CAST([6] AS varchar(1)),'0'),'-') AS [6],
ISNULL(NULLIF(CAST([7] AS varchar(1)),'0'),'-') AS [7],
ISNULL(NULLIF(CAST([8] AS varchar(1)),'0'),'-') AS [8],
ISNULL(NULLIF(CAST([9] AS varchar(1)),'0'),'-') AS [9]
FROM
(
SELECT
E.Number ,
SUBSTRING(CAST(E.Number AS varchar(4)),Location,1) AS String
FROM CTE AS E
JOIN
(
SELECT X.Number
FROM Number AS N
CROSS JOIN Number AS X
WHERE X.Number % N.Number <> 0
AND X.Number > 1
AND N.Number > 0
AND N.Number < X.Number
AND X.Number % 2 <> 0
GROUP BY X.Number
HAVING (X.Number - COUNT(*)) = 2
) AS R ON E.Number = R.Number
) AS P
PIVOT
(
COUNT(String) FOR String IN ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9])
) AS PV
ORDER BY Number
OPTION (MAXRECURSION 1000)
質數判斷部分是直接拿網路上的 T-SQL 語法來應用。- 質數判斷參考文章
- Prime Numbers
- Prime factors using T-SQL
- SQL and the search for Prime and Perfect numbers
- 利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句
- 回文判斷參考文章
- Palindrome
- 參考資料:
- TSQL Beginners Challenge 7 - Count the occurrence of numbers in the Palindrome Primes
- MSDN SQRT
沒有留言:
張貼留言