返回最大的n,使得R [n] = S.

时间:2015-09-11 21:51:00

标签: python memory out-of-memory scalability space-complexity

  

写一个函数答案(str_S),给定基数为10的字符串   表示整数S,返回最大的n,使得R(n)=   S.将答案作为基数10表示的字符串返回。如果有   不是这样的,返回"无"。 S将是一个正整数不大   比10 ^ 25。

     

其中R(n)是时间n处的zombits数:

R(0) = 1
R(1) = 1
R(2) = 2
R(2n) = R(n) + R(n + 1) + n (for n > 1)
R(2n + 1) = R(n - 1) + R(n) + 1 (for n >= 1)

Test cases
==========

Inputs:
    (string) str_S = "7"
Output:
    (string) "4"

Inputs:
    (string) str_S = "100"
Output:
    (string) "None"

我的下面的程序是正确的,但它不可扩展,因为这里S的范围可以是一个非常大的数字,如10 ^ 24。任何人都可以帮我提一些改进代码的建议,以便它可以涵盖任何输入案例。

def answer(str_S):

    d = {0: 1, 1: 1, 2: 2}
    str_S = int(str_S)
    i = 1
    while True:

        if i > 1:
            d[i*2] = d[i] + d[i+1] + i
            if d[i*2] == str_S:
                return i*2
            elif d[i*2] > str_S:
                return None

        if i>=1:
            d[i*2+1] = d[i-1] + d[i] + 1
            if d[i*2+1] == str_S:
                return i*2 + 1
            elif d[i*2+1] > str_S:
                return None

        i += 1

print answer('7')

1 个答案:

答案 0 :(得分:1)

首先,你在哪里进行缩放?我用30位数字运行你的代码,似乎完成没问题。你有记忆限制吗? Python可以处理任意大的整数,尽管非常大的整数会被转换为数字算术模式。

考虑到R值的密度,我怀疑如果切换到直接数组,可以节省空间和时间:使用值作为数组索引而不是dict键。