数组校验和算法-Python 3

数组校验和算法-Python 3,python,arrays,algorithm,checksum,Python,Arrays,Algorithm,Checksum,我一直在代码修道院研究第17题。任务是查找数组的校验和 我希望能解释一下为什么答案是正确的,为什么我的解决方案不起作用 将为您提供应计算校验和的数组。按如下方式执行计算:对于数组的每个元素(从开头开始),将该元素添加到结果变量中,并将该和乘以113——模10000007取的新值应成为结果的下一个值,依此类推 例如: input data: 6 3 1 4 1 5 9 answer: 8921379 所有输入值都在0和100000000之间-请确保在计算过程中注意可能的溢出 这是我的尝试:

我一直在代码修道院研究第17题。任务是查找数组的校验和

我希望能解释一下为什么答案是正确的,为什么我的解决方案不起作用

将为您提供应计算校验和的数组。按如下方式执行计算:对于数组的每个元素(从开头开始),将该元素添加到
结果
变量中,并将该和乘以
113
——模
10000007
取的新值应成为
结果
的下一个值,依此类推

例如:

input data:
6
3 1 4 1 5 9

answer:
8921379
所有输入值都在
0
100000000
之间-请确保在计算过程中注意可能的溢出

这是我的尝试:

a = [int(x) for x in input().split()]

def get_checksum(a):
    seed = 113
    limit = 10000007
    result = 0

    for i in range(len(a) - 1):
        result += a[i]
        result *= seed
        result %= limit

    return result

print(get_checksum(a))

如果将另一个对象添加到数组末尾,则会得到正确答案:

a = [3, 1, 4, 1, 5, 9, "X"]

def get_checksum(a):
    seed = 113
    limit = 10000007
    result = 0

    for i in range(len(a) - 1):
        result += a[i]
        result *= seed
        result %= limit

    return result

print(get_checksum(a))
#>>> 8921379
正如Peter de Rivaz所说,这是因为你错过了最后一个元素。接受凯文的答案,只需在
a
中的项目上循环:

a = [3, 1, 4, 1, 5, 9]

def get_checksum(a):
    seed = 113
    limit = 10000007
    result = 0

    for item in a:
        result += item
        result *= seed
        result %= limit

    return result

print(get_checksum(a))
#>>> 8921379

这会打印出
8921379

这会遗漏最后一个元素,try range(len(a))或者更好,完全跳过索引并对a中的项执行
6235989是我的代码使用提供的测试用例生成的(每次刷新页面时随机提供新的测试用例),但答案是正确的(同样,以当前测试数组作为输入)为4669996。此外,我从数组长度中减去1的原因是为了索引目的,即a[0].你们觉得我的算法怎么样?很明显,我做错了什么,因为我每次都得到了错误的答案。然而,我完全按照作者给出的方向去做……要么作者没有很好地解释算法,要么我错过了什么,要么就是在做错事。前提是作者这个练习的一部分是一个比我好得多的程序员,我将使用后者:/你将不得不给我们一个测试用例,因为我只使用链接页面上的一个。哇…我现在感觉像是一个彻底的失败者…典型的新手错误…但是,事实上,我确实感觉很好,我几乎拥有了这个算法这似乎总是最小、最简单的小细节…所以,非常感谢Kevin、Peter de Rivaz和Veedrac!我感谢你们花时间查看我的代码并给我有用的解释,而不是因为我的新手错误而嘲笑我。哦,Veedrac,感谢你们编辑我的帖子;因为这是我的第一篇帖子,我在以后的帖子中,我们会注意遵循此模板。再次感谢大家!
def get_checksum(a):
    seed = 113
    limit = 10000007
    result = 0

    for i in range(len(a)):
        result += a[i]
        result *= seed
        result %= limit

    return result

    print(get_checksum([3, 1, 4, 1, 5 , 9]))