藍橋杯 花朵數 解題報告

2021-06-28 19:49:57 字數 1597 閱讀 3184

乙個n位的十進位制正整數,如果它的每個位上的數字的n次方的和等於這個數本身,則稱其為花朵數。

例如:當n=3時,153就滿足條件,因為 1^3 + 5^3 + 3^3 = 153,這樣的數字也被稱為水仙花數(其中,「^」表示乘方,5^3表示5的3次方,也就是立方)。

當n=4時,1634滿足條件,因為 1^4 + 6^4 + 3^4 + 4^4 = 1634。

當n=5時,92727滿足條件。

實際上,對n的每個取值,可能有多個數字滿足條件。

程式的任務是:求n=21時,所有滿足條件的花朵數。注意:這個整數有21位,它的各個位數字的21次方之和正好等於這個數本身。

如果滿足條件的數字不只有乙個,請從小到大輸出所有符合條件的數字,每個數字佔一行。因為這個數字很大,請注意解法時間上的可行性。

首先,我們任然使用之前的大數系統,也就是通過字串來表示大數。因為題目要求是說每一位的21次方之和,也就是說,這個和實際上跟數字的順序並沒有關係,舉個簡單的例子,123和321的每一位的3次方之和並沒有區別,然後我們就可以換乙個角度來考慮這個問題,如果純粹的列舉數字,必定會出現大量的重複,為了避免重複,我們直接列舉每乙個數字出現的次數,比如0出現3次,1出現2次,2出現4次。。。如果能很好的處理這個排列組合,使之不發生重複,那效率提高了不是一點點。

關鍵問題是怎樣模擬這個排列呢,總不能用10個for迴圈吧,那種太low了,在迴圈太多的情況下,我們用什麼方法呢?沒錯,就是遞迴。

在遞迴的時候,我們要列舉從0到9這10個數每乙個數出現的次數,遞迴出口當然就是列舉到9時,因為總位數為21位,只要前9個數出現的次數確定了,那第十個數(9)出現的次數也就確定了,就是21-used,當獲得了一組資料nn之後,我們將這組資料所代表的和sum求出來,這裡注意,因為列舉的是每乙個數字出現的次數,所以我們並不知道那個21位數到底是幾,但是,我們可以通過nn這組資料,把乙個21位的空陣列num填滿,不用考慮順序,填滿之後,我們把sum和num進行排序,如果這兩個陣列的每一位都相等,那說明這個sum的值就是我們要求的值,輸出即可。

這個**在我i7的本子上執行80+s,還算可以了

藍橋杯 花朵數

乙個n位的十進位制正整數,如果它的每個位上的數字的n次方的和等於這個數本身,則稱其為花朵數。例如 當n 3時,153就滿足條件,因為 1 3 5 3 3 3 153,這樣的數字也被稱為水仙花數 其中,表示乘方,5 3表示5的3次方,也就是立方 當n 4時,1634滿足條件,因為 1 4 6 4 3 ...

藍橋杯 花朵數

花朵數 花朵數是指乙個數的各個位數的該數的位數次方相加等於該數本身 例 153 1 3 5 3 3 3 程式的任務是 求n 21時,所有滿足條件的花朵數。注意 這個整數有21位,它的各個位數字的21次方之和正好等於這個數本身。如下 public class main public static vo...

藍橋杯 黑洞數 解題報告

任意乙個5位數,比如 34256,把它的各位數字打亂,重新排列,可以得到乙個最大的數 65432,乙個最小的數23456。求這兩個數字的差,得 41976,把這個數字再次重複上述過程 如果不足5位,則前邊補0 如此往復,數字會落入某個迴圈圈 稱為數字黑洞 比如,剛才的數字會落入 82962,7593...