題目連結:
題目大意:
定義 S1 = 1 、 S2 = 12 、 S3 = 123 、 …… S10 = 12345678910 、 …… Si = Si-1 + i (字串加法)
再定義 S 為 S1 + S2 + S3 + ……。現給定一正整數 T ,代表接下來有 T 筆測試資料。一筆測試資料佔一列,每列給定一正整數 x (1 ≦ x ≦ 2, 147, 483, 647)。求 S由左到右數來第 x 個數字為何?
首先我們需要判斷出第 x 位在 S 中的區間 Si ,其i的值為何。因為 S1 長度為 1 、 S2 長度為 2 …… S10 長度為 11 、 S11 長度為 13 、…… 所以可以先決定出 x 在 Si 之 i 值為 1 ~ 5 位數長其中何者。
對於 i 為一位數長的之 Si 長度總和為 45 ;一位數 ~ 兩位數長的 Si 長度總和為 9045 ;同理,三位數以下、四位數以下分別為 1395495 以及 189414495 位數長。
因此,如果 x ≦ 45 ,則 x 在的 Si 之 i 為一位數長;如果 45 < x ≦ 9045,則 Si 之 i 為兩位數長……以此類推。
有了 i 的長度時,就可以根據其長度去求其 i 的精確值。可以寫為一等差數列,公差即是 i 的長度,首項之長度 = i 的長度 - 1 的末項之長度 + i 之長度,每個人可能推出的公式不太一樣,因此不在此列出。
有了 i 之精確值之後,可以直接暴力搜尋出第 x 位之數字為何;但也可以繼續使用類似公式解的方式去求,即求第 x 位在 1 + 2 + 3 + …… + i (一樣是字串加法)之中的哪個數字裡。接著再使用暴力法拆解其數,找到第 x 位數字之值即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。