簡體   English   中英

如何找到像1491625這樣的數字中的第n位?

[英]how to find n'th digit in a number like 1491625…?

讓我們連接以1開頭的數字的平方。那么,這個字符串中的第n個數字是多少?

例如,第10位是4。

1 4 9 16 25 36 49 64 81

這只是一個普通的問題,是我的普通思想。 今晚如何才能解決這個問題呢? 沒有循環的任何算法?

您可以通過取10次冪的平方根來計算此序列中有多少1位,2位,3位等數字。 這將允許您確定第n個數字所在的數字。從那里,它應該是非常微不足道的。

這應該是O(log n)復雜度。

ceil(log 10 (x + 1))將給出一個數字中的位數。 迭代通過正方形保持總長度的計數,一旦達到或超過目標長度n,你就知道你需要m的最后一個數字的第m位數(易於計算)。 通過除以10 m-1獲得該數字的第m位數,而不是使用mod 10獲取最后一位數字。

總而言之,恆定空間開銷和O(n)運行時。

Haskell中的懶惰無限列表使這個無聊的表達天真。

ghci> concat [show $ i*i | i <- [1..]] !! 9
'4'

為了解決這個問題,我使用了Python生成器 我的Python解決方案:

def _countup(n):
    while True:
        yield n
        n += 1

def get_nth_element(n):
    i = 0 # Initialized just to keep track of iterations.
    final_string = ''
    cu_generator = _countup(0)

    while True:
        num = cu_generator.next()
        final_string += str(num * num)
        if len(final_string) > n:
            print "Number of iterations %s" % i
            return final_string[n]
        i += 1

跑:

>>> get_nth_element(1000)
Number of iterations 229
'2'

>>> get_nth_element(10000)
Number of iterations 1637
'7'

如果你已達到n,你為什么不循環,取每個數字,平方並遞增計數,從每一步檢查1? 您無需跟蹤整數。 這是一個簡單的模擬練習。 我擔心,我無法確定這種模式或公式。

這是一個直接端口的ephemient的Haskell對Scala的回答

Iterator.from(1).flatMap(x=>(x*x).toString.iterator).drop(9).next

返回4

上)

  • Iterator.from(1)創建一個無數的迭代器,它計算1,2,3,4,....
  • 然后(x*x).toString計算每個的平方並將它們變成字符串。
  • flatMap( ... .iterator)將這些連接起來,成為所討論序列中字符的無限迭代器
  • drop(9)從迭代器中刪除前9個元素(索引0到8)並給我們一個等待索引9的新迭代器
  • next給我們那個單一的角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM