我正在学习编码,目前正试图在codefights上解决问题;
考虑一系列数字a0,a1,...,an,其中一个元素等于前一个元素的平方数字之和。一旦已经出现在序列中的元素再次出现,序列就会结束。
给定第一个元素a0,找到序列的长度。
输入/输出
[时间限制] 4000ms(py3) [输入]整数a0
序列的第一个元素,正整数。
保证约束: 1≤a0≤650。
[输出]整数 这是我的代码:
def值(a):
for i in str(a):
val = val + i**2
return val
def squareDigitsSequence(a0):
a=a0
while (a not in list) is True:
for i in len(str(a)):
b=value(a)
list.append(b)
a=b
return len(list)
但我收到此错误: while(不在列表中)为True: TypeError:类型'type'的参数不可迭代。 我该如何解决这个问题?
答案 0 :(得分:1)
正如glibdud指出的那样,您尚未初始化列表变量(将其命名为list
是一个坏主意)。另外,您的其他函数中未定义val
。此外,在第二个函数中,由于要对字符串(而不是整数)进行平方运算并将其附加到未定义的变量上,因此可能会遇到不受支持的操作数错误。
尝试以下方法:
def squareDigitsSequence(a0):
# the list in which you'll store the elements you've seen, starting with a0
used_elements = [a0]
# I chose to break out of the while loop and return something when a duplicate
# was found
while True:
temp_val = value(used_elements[-1])
# here the duplicate is not included
if temp_val in used_elements:
return len(used_elements)
else:
used_elements.append(temp_val)
def value(b):
sum = 0
# convert string representation of each digit to int and square them, add to sum
for char in str(b):
sum += int(char) ** 2
return sum
当a0为1时,它将返回1,因为used_elements列表将仅为[1]
,而当a0
为2时将返回9,因为used_elements
将为[2, 4, 16, 37, 58, 89, 145, 42, 20]
由于20的平方和为4,因此该值已在列表中。随时尝试使用a0
的其他值,并告诉我是否需要澄清。
答案 1 :(得分:0)
我的代码通过了所有测试用例:-
def squareDigitsSequence(a0):
seq = [a0]
while seq[-1] not in seq[:-1]:
seq.append(sum(int(i)**2 for i in str(seq[-1])))
return len(seq)