## 【36】Double-base palindromes雙進制迴文數 十進位數字585=10010010012在十進位和二進位下都是回文數。 請找出所有小於100,0000的數,在二進位下也是回文數的十進位數字的和。 (請注意,回文數(以任何一個為底)都不能包含前導零。) ### 數字翻轉法: 因為是整數,所以可以求出該整數的翻轉後的數值,看是否與原來整數相等。如果相等,則是回文數,否則不是。例如12321翻轉後為12321,所以是回文數;而1231翻轉後為1321,與1231不相等,所以不是回文數。 觀察下面這一段程式碼,想想看,輸出為何是54321?  ### 【練習1】模仿上面程式碼,輸入任意一串數,將其前後顛倒,產生它的回文數 注意:使用n =input("輸入一個數字:"),得到的n是文字串,不是數值喔! 必須n = int(input("輸入一個數字:"))才會是數值 ### 【練習2】利用上面練習,把判斷過程定義成函式,然後輸入數字,判斷是否為回文數?  在練習2中,輸入12321可以判斷是否回文,那輸入11011也可以檢驗任一個二進位數是否回文。 #### 如果不用數字處理,改用字串處理,會不會更簡單? #### 使用字串處理還有一個方便之處,就是反序輸出很簡單,參考用法:  ### 【練習3】找出小於100,0000的回文數,有1998個喔! 略。這個比較容易,你自己來吧! ### 【練習4】做一個函式,可以將任一個十進位數換算成二進位數輸出,參考:  #### 將十進位化成二進位的方法,就是不斷除以2,留下餘數不是1就是0,但是上面函式顯示餘數是現除出來的先放,所以得到10011,而正確二進位應該是11001。 #### 現在你有2道問題要克服,(1)將順序反過來,(2)直接輸出成數字,而不是list。 python提供一個轉換2進位的指令bin,但是它的輸出是字串,參考用法:  如果用這種方法,是不是比前面提供的練習範例更好? ## 請找出所有小於100,0000的數,在二進位下也是回文數的十進位數字的和(不包含前導零)。 PS1:0算不算回文數,算也沒關係,總和不便。 PS2:如果用數字處理二進位回文判斷,會遇到一個很大的陷阱: 雖然Python沒有限制長整數數值的大小,但實際上由於機器記憶體有限。我們使用的長整數數值不可能無限大。makePd中,1百萬以下沒問題,1億也沒問題,但是超過1千兆,這麼大的數做除法運算,換成二進位,就會出問題。  所以建議你用字串處理! PS3:偷偷告訴你,只要考慮奇數,因為偶數化成二進位,尾端一定是0,不用考慮。 for n in range(1,1000000,2):<--這樣程式跑起來少一半時間,如果配字串涵式bin寫法,只要0.25秒跑出答案。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up