codefights方形数字序列(python)

时间:2017-06-27 02:59:25

标签: python-3.x

我正在学习编码,目前正试图在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'的参数不可迭代。 我该如何解决这个问题?

2 个答案:

答案 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)