切換
舊版
前往
大廳
主題

ZeroJudge - a532: 奇特的數列 解題心得

Not In My Back Yard | 2019-03-26 23:17:52 | 巴幣 2 | 人氣 330

題目連結:


題目大意:
有一數列為:0、1、8、11、69、88、96、101、111、181……

現給定一正整數 N (0 < N ≦ 1, 000, 000),求上面數列的第 N 項。當 N = 0 時,結束程式。



範例輸入:
1
2
3
0


範例輸出:
0
1
8


解題思維:
題目給定的數列之規律,仔細觀察可以看出:數列中每個數字翻轉 180 度後,仍是同樣的數字。此即為線上整數數列大全(The On-line Encyclopedia of Integer Sequences,簡稱OEIS)的數列 A000787

而我們可以再觀察出這個數列的生成模式:
三位數是由兩位數剖半,中間加上「0」、「1」或是「8」。即 101、111、181、609、619、689、808、818、888、906、916、986。
四位數也是由兩位數剖半,中間加上「00」、「11」、「69」、「88」、「96」。即 1001、1111、1691、1881、1961、6009、……
而同理,五位數為四位數剖半,中間加上「0」、「1」或是「8」;六位數為四位數剖半,中間加上「00」、「11」、「69」、「88」、「96」。
其他,以此類推。

因此,我們可以先將第 1 ~ 1, 000, 000項全部生出來。再看輸入第幾項,再輸出相應的項次。


雖然,本人是採取上面的作法,即先把數列全部生出來。但是也可以使用遞迴去求解,我們知道:
三位數的數量 = 3 × 4 (4是兩位數的數量)、四位數的數量 = 5 × 4 ;
五位數數量 = 3 × 20、六位數數量 = 5 × 20 …… 以此類推。

因此,我們也可以事先算出給定的 N 所指涉的第 N 項是幾位數,然後根據它的竒偶性由兩側至中間得出應有的數字。

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

創作回應

更多創作