如何在像1491625这样的数字中找到第n位?

时间:2011-01-26 21:29:39

标签: algorithm math

让我们连接以1开头的数字的平方。那么,这个字符串中的第n个数字是多少?

例如,第10位是4.

1 4 9 16 25 36 49 64 81

这只是一个普通的问题,来到我普通的心灵。今晚如何才能解决这个问题呢?没有循环的任何算法?

6 个答案:

答案 0 :(得分:11)

你可以通过取10次幂的平方根来计算这个序列中有多少1位,2位,3位等数字。这将允许您确定 n -th数字所在的数字。从那里,它应该是非常简单的。

这应该是 O(log n)的复杂性。

答案 1 :(得分:3)

ceil(log 10 (x + 1))将为您提供数字中的位数。迭代通过正方形保持总长度的计数,一旦达到或超过目标长度n,你就知道你需要m的最后一个数字的第m位数(易于计算)。通过除以10 m-1 获得该数字的第m位数,而不是使用mod 10获取最后一位数字。

一切,恒定的空间开销和O(n)运行时。

答案 2 :(得分:1)

Haskell中的懒惰无限列表使这一点无聊表达天真。

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

答案 3 :(得分:1)

为了解决这个问题,我使用了Python Generators。我在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

RUN:

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

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

答案 4 :(得分:0)

如果你已达到n,你为什么不循环,取每个数字,平方并递增计数,从每一步检查1?您无需跟踪整数。 这是一个简单的模拟练习。我担心,我无法确定这种模式或公式。

答案 5 :(得分:0)

这是ephemient的Haskell对Scala的回答的直接端口

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

返回4

O(n)的

  • Iterator.from(1)创建一个计算1,2,3,4,....
  • 的无限迭代器
  • 然后(x*x).toString计算每个方格的平方并将它们变成字符串。
  • flatMap( ... .iterator)将这些连接成为有问题序列中字符的无限迭代器
  • drop(9)从迭代器中删除前9个元素(索引0到8),并为我们提供了一个等待索引9的新迭代器
  • next为我们提供了这个字符。