王威 王德貴
一個三位“自冪數”就是這個三位數的每個數字的立方和與其本身相等,這樣的三位數也叫“水仙花數”;如果一個四位數的每一位的四次方和與其本身相等,這樣的四位數叫“玫瑰花數”;符合同樣規則的五位數叫“五角星數”;當位數大于五位時,符合一個n位自然數等于自身各個數位上數字的n次冪之和,則稱此數為“自冪數”。兩位數沒有自冪數。
前幾期文章,我們了解了數學黑洞,今天我們繼續用Python來分析和研究一類新的數學黑洞——自冪數。
前面幾篇數學黑洞問題,在研究時真的感到很有意思,還有些奇妙,這就更增添了學習的興趣。自冪數和“6174”等數學黑洞的規則不同,算法思路也就會有一些差異。
通過輸入一個數字,根據位數進行枚舉計算,輸出滿足條件的數。
程序是將數值轉換為字符串,然后依次取出每個數字字符,進行冪運算,如果計算結果與本身相等,則滿足條件,輸出。
比如輸入一個三位數,取出每個數字字符計算立方和,如果和本身相等,即是滿足條件的數值。
如果位數多了,其冪次用字符串長度表示即可。即位數是利用10的冪次表示,比如10**2,即10的平方為100,是三位數。
程序涉及的是中國電子學會編程等級考試二級的內容:for/range()。
我們不久前才介紹了while循環,在條件為True時,while循環會繼續循環。但如果你想讓一個代碼塊執行固定的次數該怎么辦呢?答案是:可以通過for循環語句和range()函數來實現。
range()函數可以只設置終止值,range(stop),也可以設置三個參數range(start,stop[,step])。
start為開始值,開始值作為開始的那個數,不輸入的話默認從0開始。
stop為結束值,結束值所代表的不是結束的那個值,而是結束的那個下標,結束值的下標是從0開始算起。例如你輸入5,那么輸出之后就是4。也就是我們說的左閉右開,結束值不可省略。
step為步進值,步進值代表一次你想要步進多少個,假如輸入1的話,那輸出之后就可以看到每一個數據之間相隔了1的差距,如果步進值省略的話,它的默認值依舊是1,只有當你自己輸入其他的步進值,它才會改變。
程序如圖1:

運行結果發現,水仙花數只有4個:153、370、371、407(圖2)。

程序如圖3:

運行結果發現,玫瑰花數只有3個:1634、8208、9474(圖4)。

程序如圖5:

運行結果發現,五角星數只有3個:54748、92727、93084(圖6)。

程序如圖7:

運行結果發現,6位數的自冪數為:548834(圖8)。

可以看到繼續使用這種方式,在更高位時輸入容易出錯,所以我改用10的冪次,設定位數。程序修改如下(圖9)。

由運算結果看,6位自冪數只有1個,而7位自冪數有4個。這也證明我們的程序可以用來驗證任意給定范圍內的自冪數了(圖10)。

通過驗證,大家對自冪數有了進一步的理解,我們也做出了較為通用的程序,大家還可以繼續優化程序,或是其他方法實現。根據這個算法也可以利用圖形化編程實現,有興趣的讀者可以自行研究,本文不再贅述。
本文也是我自己的研究過程和心得,有不妥之處,請各位老師和同學斧正!