---
# System prepended metadata

title: Untitled

---

## 【36】Double-base palindromes雙進制迴文數
十進位數字585=10010010012在十進位和二進位下都是回文數。
請找出所有小於100,0000的數，在二進位下也是回文數的十進位數字的和。
（請注意，回文數（以任何一個為底）都不能包含前導零。）

### 數字翻轉法：
因為是整數，所以可以求出該整數的翻轉後的數值，看是否與原來整數相等。如果相等，則是回文數，否則不是。例如12321翻轉後為12321，所以是回文數；而1231翻轉後為1321，與1231不相等，所以不是回文數。

觀察下面這一段程式碼，想想看，輸出為何是54321？
![](https://i.imgur.com/PlfdJRc.png)
       
### 【練習1】模仿上面程式碼，輸入任意一串數，將其前後顛倒，產生它的回文數
注意：使用n =input("輸入一個數字：")，得到的n是文字串，不是數值喔！
            必須n = int(input("輸入一個數字："))才會是數值


### 【練習2】利用上面練習，把判斷過程定義成函式，然後輸入數字，判斷是否為回文數？
![](https://i.imgur.com/B6FdP2X.png)
 


在練習2中，輸入12321可以判斷是否回文，那輸入11011也可以檢驗任一個二進位數是否回文。

#### 如果不用數字處理，改用字串處理，會不會更簡單？
#### 使用字串處理還有一個方便之處，就是反序輸出很簡單，參考用法：
![](https://i.imgur.com/qQJ0I3k.png)



### 【練習3】找出小於100,0000的回文數，有1998個喔！

略。這個比較容易，你自己來吧！


### 【練習4】做一個函式，可以將任一個十進位數換算成二進位數輸出，參考：
![](https://i.imgur.com/BZAATGR.png)

		 
#### 將十進位化成二進位的方法，就是不斷除以2，留下餘數不是1就是0，但是上面函式顯示餘數是現除出來的先放，所以得到10011，而正確二進位應該是11001。
#### 現在你有2道問題要克服，(1)將順序反過來，(2)直接輸出成數字，而不是list。
 python提供一個轉換2進位的指令bin，但是它的輸出是字串，參考用法：
![](https://i.imgur.com/1WcOpSp.png)

如果用這種方法，是不是比前面提供的練習範例更好？


## 請找出所有小於100,0000的數，在二進位下也是回文數的十進位數字的和(不包含前導零)。

PS1：0算不算回文數，算也沒關係，總和不便。
PS2：如果用數字處理二進位回文判斷，會遇到一個很大的陷阱：
雖然Python沒有限制長整數數值的大小，但實際上由於機器記憶體有限。我們使用的長整數數值不可能無限大。makePd中，1百萬以下沒問題，1億也沒問題，但是超過1千兆，這麼大的數做除法運算，換成二進位，就會出問題。
![](https://i.imgur.com/ZtdM7wS.png)

所以建議你用字串處理！
PS3：偷偷告訴你，只要考慮奇數，因為偶數化成二進位，尾端一定是0，不用考慮。
for n in range(1,1000000,2):<--這樣程式跑起來少一半時間，如果配字串涵式bin寫法，只要0.25秒跑出答案。
