演算法趣題:迴文十進位制數
今天下午收到高宇涵老師的寄來的《程式設計師的演算法趣題》,這本書的第 1 題是迴文十進位制數:
求用十進位制、二進位制、八進位制表示都是迴文數的所有數字中,大於十進位制數 10 的最小值。
書中的解題思路是:
因為是二進位制的迴文數,所以如果最低位是 0,那麼相應地最高位也是 0。但是,以 0 開頭肯定是不恰當的,由此可知最低位為 1。
如果用二進位制表示時最低位為 1,那這個數一定是奇數,因此只考慮奇數的情況就可以。接下來可以簡單地編寫程式,從 10 的下一個數字 11 開始,按順序搜尋。
書中使用 Ruby 和 JavaScript 編寫程式求解,如果使用 Haskell 編寫程式求解:
import Data.Digits ( digitsRev )
main = print $ head $ filter (\n -> and [(\a -> a ==
reverse a) $ digitsRev b n | b <- [10,8,2]]) [11,13..]
這個程式執行 0.01 秒後,得到答案:
58510 = 11118 = 10010010012
進階
書中的演算法對於這個問題是恰當的,但是如果要尋找更大的滿足要求的數,就太慢了。我們可以事先構造出十進位制奇迴文數,以加快尋找速度。由此,我使用 Haskell 語言編寫以下程式:
import Data.Digits ( digitsRev )
main = print $ concat [filter (\n -> and [(\a -> a == reverse a) $
digitsRev b n | b <- [2,8]]) [read $ x : s ++ y ++ reverse s ++ [x]
| x <- "13579", s <- if n /= 0 then [replicate (n - length t) '0'
++ t | i <- [0 .. 10^n-1], let t = show i] else [""], y <- if z
then map show [0..9] else [""]] | n <- [0..3], z <- [False, True]]
簡要說明:
- 第 2 至 3 行檢查所給的十進位制奇迴文數是不是二進位制和八進位制迴文數。
- 最後一行 z = False 時生成 xabccbax 形狀的十進位制奇迴文數,x 是奇數(見第 4 行)。
- 最後一行 z = True 時生成 xabcycbax 形狀的十進位制奇迴文數,第 4 行的 s 就是"abc" 。
- 最後一行的 n 決定生成的十進位制奇迴文數的位數,共 2n+2 (z = False) 或 2n+3 (z = True) 位。
在這個程式中的最後一行中,n 從 0 至 3,用於在 2 位至 9 位的十進位制奇迴文數中尋找。執行這個程式,瞬間(用時 0.4 秒)得到:
71984891710 = 52720027258 = 1010101110100000000101110101012
但是,我沒有找到更大的滿足要求的數。不知道是否還存在這樣的數。
相關文章
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- stoi字串轉十進位制數越界問題字串
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
- n進位制轉十進位制
- 十進位制轉十六進位制
- 牛客網測試題 把十六進位制數字轉換為十進位制數字
- 十進位制——二 (八、十六 )進位制
- Qt進位制轉換(十進位制轉十六進位制)QT
- 十進位制轉十六進位制(藍橋杯之前每日一題)每日一題
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 二進位制、十進位制與十六進位制相互轉化
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 二進位制轉十進位制快速方法
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- JavaScript十進位制轉換為二進位制JavaScript
- 十進位制轉二進位制推導(草稿)
- 進位制數轉換方法(八/十六/十)
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 對十進位制數字的按位輸出,取反,並求其位數
- 羅馬數字轉換成十進位制
- 負數的二進位制數問題
- 對於十進位制數 -1023,包含符號位在內,至少需要多少個二進位制位表示該數符號
- 3416:【例72.1】 二進位制轉化為十進位制
- [20190716]十進位制轉換其他進位制指令碼.txt指令碼
- 十進位制轉換任意進位制--鏈棧實現
- java二進位制運算十進位制(精確運算)Java
- Python 十進位制轉換為二進位制 高位補零Python
- 八進位制,十六進位制和浮點數
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 演算法題:迴文演算法
- 使用 Haskell 將十進位制數字轉成羅馬數字Haskell
- 在c語言中輸出8進位制數,16進位制數C語言
- 負數補碼(16進位制轉10進位制的負數)