【问题标题】:Array Checksum Algorithm - Python 3数组校验和算法 - Python 3
【发布时间】:2014-09-11 18:57:50
【问题描述】:

我一直在 Code Abbey 处理问题 17。任务是找到一个数组的校验和。

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

This is the problem:

您将获得应计算校验和的数组。执行如下计算:对于数组的每个元素(从头开始)将此元素添加到 result 变量并将此和乘以 113 - 这个新值取模 10000007 应该成为 @987654325 的下一个值@,等等。

例子:

input data:
6
3 1 4 1 5 9

answer:
8921379

所有输入值都在01,000,000,000 之间 - 请务必注意计算过程中可能出现的溢出。

这是我的尝试:

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

【问题讨论】:

  • 这会漏掉最后一个元素,试试 range(len(a))
  • 或者更好的是,完全跳过索引并执行for item in a:
  • 6235989 是我的代码使用提供的测试用例生成的(每次刷新页面时都会随机提供新的测试用例),但正确的答案(再次,以当前测试数组作为输入)是 4669996。另外,我从数组长度中减去 1 的原因是为了索引目的,即 a[0]。
  • 你们觉得我的算法怎么样?显然,我做错了什么,因为我每次都得到错误的答案。但是,我完全按照作者给出的指示进行操作......要么作者没有很好地解释算法,要么我错过了一些东西,或者只是做错了什么。如果这个练习的作者是一个比我更好的程序员,我会选择后者:/
  • 你将不得不给我们一个测试用例,因为我只是用链接页面上的那个。

标签: python arrays algorithm checksum


【解决方案1】:

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

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 所说,这是因为您缺少最后一个元素。拿 Kevin 的答案,然后遍历 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

【讨论】:

  • 哇...我现在感觉自己完全是个失败者...经典的菜鸟错误...但是,我确实对我的算法几乎正确的事实感到非常满意。它似乎总是最小、最简单的小细节……所以,非常感谢 Kevin、Peter de Rivaz 和 Veedrac!感谢你们花时间查看我的代码并给我有用的解释,而不是因为我的菜鸟错误而取笑我。哦,还有 Veedrac,谢谢你编辑我的帖子;由于这是我的第一篇文章,我会注意在以后的文章中遵循这个模板。再次感谢,伙计们!
【解决方案2】:
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]))

这会打印出8921379

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 2017-08-24
    • 2010-12-18
    • 2021-05-11
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多