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 478。

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

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 编辑 链接将在新窗口或新标签页中打开
x86-64 Assembly Exercism

准备好开始 Luhn 了吗?

注册 Exercism,借助 22 个概念130 个练习 和真人导师指导,学习并掌握 x86-64 Assembly,全部免费。

深入探索 Luhn!

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