写一个函数答案(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')
答案 0 :(得分:1)
首先,你在哪里进行缩放?我用30位数字运行你的代码,似乎完成没问题。你有记忆限制吗? Python可以处理任意大的整数,尽管非常大的整数会被转换为数字算术模式。
考虑到R值的密度,我怀疑如果切换到直接数组,可以节省空间和时间:使用值作为数组索引而不是dict键。