切換
舊版
前往
大廳
主題

ZeroJudge - c734: Sequence 解題心得

Not In My Back Yard | 2019-04-15 21:29:17 | 巴幣 0 | 人氣 291

題目連結:


題目大意:
定義 S = 1 、 S = 12 、 S = 123 、 …… S10 = 12345678910 、 …… S = Si-1 + i (字串加法)

再定義 S 為 S + S + S + ……。現給定一正整數 T ,代表接下來有 T 筆測試資料。一筆測試資料佔一列,每列給定一正整數 x (1 ≦ x ≦ 2, 147, 483, 647)。求 S由左到右數來第 x 個數字為何?



範例輸入:
5
1
3
5
7
9


範例輸出:
1 2 2 1 3


解題思維:
首先我們需要判斷出第 x 位在 S 中的區間 S ,其i的值為何。因為 S 長度為 1 、 S 長度為 2 …… S10 長度為 11 、 S11 長度為 13 、…… 所以可以先決定出 x 在 S 之 i 值為 1 ~ 5 位數長其中何者。

對於 i 為一位數長的之 S 長度總和為 45 ;一位數 ~ 兩位數長的 S 長度總和為 9045 ;同理,三位數以下、四位數以下分別為 1395495 以及 189414495 位數長。

因此,如果 x ≦ 45 ,則 x 在的 S 之 i 為一位數長;如果 45 < x ≦ 9045,則 S 之 i 為兩位數長……以此類推。

有了 i 的長度時,就可以根據其長度去求其 i 的精確值。可以寫為一等差數列,公差即是 i 的長度,首項之長度 = i 的長度 - 1 的末項之長度 + i 之長度,每個人可能推出的公式不太一樣,因此不在此列出。

有了 i 之精確值之後,可以直接暴力搜尋出第 x 位之數字為何;但也可以繼續使用類似公式解的方式去求,即求第 x 位在 1 + 2 + 3 + …… + i (一樣是字串加法)之中的哪個數字裡。接著再使用暴力法拆解其數,找到第 x 位數字之值即可。

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

創作回應

更多創作