前往
大廳
主題

ZeroJudge - f445: 263 - Number Chains 解題心得

Not In My Back Yard | 2020-11-28 00:00:04 | 巴幣 0 | 人氣 391

題目連結:


題目大意:
輸入有多列,每列給定一正整數 N (N < 10 ^ 9,當 N = 0 時代表輸入結束),代表原始的數字。

接著我們要對這個數字做以下事情:
將其每個位數按照值的大小從高位數到低位數,由小到大排由此生成一數字 a
再將其每個位數按照值的大小從高位數到低位數,由大到小排由此生成一數字 b
得到一個新的數字 b - a ,作為新的數字重複以上步驟,直到數字重複。

試問以上過程的內容以及做的次數。輸出格式參見範例輸出(每個測試資料(即每個 N)的輸出結束還要再輸出一個空白列)。



範例輸入:
123456789
1234
444
0


範例輸出:
Original number was 123456789
987654321 - 123456789 = 864197532
987654321 - 123456789 = 864197532
Chain length 2

Original number was 1234
4321 - 1234 = 3087
8730 - 378 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
Chain length 4

Original number was 444
444 - 444 = 0
0 - 0 = 0
Chain length 2



解題思維:
單純的模擬即可。

對於每次過程的 N 值,將 N 的每個位數拆開,然後進行計數排序(Counting Sort,這題有介紹)。

然後 a 從 0 開始到 9 ,對於每個數字有多少就加多少到 a 的尾端;同理 b 也是,只是倒過來從 9 到 0。然後將 b 減去 a 即是新的 N 值。

至於要判斷有沒有出現過可以使用雜湊表(Hash Table),對於 C++ 對應的就是 map 或是 set 等等。當現在的 N 值出現過時,就表示不用再做了,跳出迴圈即可。然後記得在過程中記錄做的次數。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作