Luhn

Luhn

中等

简介

在 Global Verification Authority,你刚被委以一项至关重要的任务。整座城市里,从在线购物到安全登录,无数业务都依赖数字标识符的准确性,比如信用卡号、银行账号、交易代码和追踪编号。Luhn 算法是一种简单的校验和公式,用来帮助找出输错的数字。

一批标识符刚刚送到你的桌上。它们全都要通过 Luhn 检验,才能确认是合法的。只要有通不过的,就会被标记为无效,从而避免交易出错或账户验证失败这类失误。

你能确保这件事万无一失吗?许多服务的正常运转都取决于你。

说明

根据 Luhn 公式,判断一个数字是否有效。

这个数字会以字符串的形式提供。

验证数字

长度不超过 1 的字符串无效。输入中允许有空格,但在检查前应当先把空格去掉。所有其他非数字字符都不允许出现。

示例

有效的信用卡号

要检查的数字是 4539 3195 0343 6467。

Luhn 算法的第一步是从数字末尾开始,从右数第二位起向左,把每隔一位的数字翻倍。

4539 3195 0343 6467
↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)

如果某个数字翻倍后的结果大于 9,就从该结果中减去 9。得到的结果是:

8569 6195 0383 3437

最后,把所有数字相加。如果和能被 10 整除,原来的数字就有效。

8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80

80 能被 10 整除,所以数字 4539 3195 0343 6467 是有效的!

无效的加拿大 SIN

要检查的数字是 066 123 468。

我们从数字末尾开始,从右数第二位起向左,把每隔一位的数字翻倍。

066 123 478
 ↑  ↑ ↑  ↑  (double these)

如果某个数字翻倍后的结果大于 9,就从该结果中减去 9。得到的结果是:

036 226 458

把各位数字相加:

0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36

36 不能被 10 整除,所以数字 066 123 478 无效!

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
YAMLScript Exercism

准备好开始 Luhn 了吗?

注册 Exercism,借助 60 个练习 和真人导师指导,学习并掌握 YAMLScript,全部免费。

深入探索 Luhn!

我们会探索 8 个不同版本的 Luhn,从一个非常简洁的 Ruby 实现开始,看看一些命令式和函数式的写法,最后是一个让 Erik 和 Jeremy 花了不少功夫才破译的 SQLite 版本!