1.1 Luhn算法介绍
它可以如下描述(为了方便解释,假设卡号为4388576018402626):
1)从左到右对每个数字翻倍。如果对某个数字翻倍后的结果是两位数,那么就将这两位加在一起得到一个一位数。
例:4388576018402626(从后面数,==书里写的方向是错的==。应该是从右往左数),见下表
| 从右数位置 | 原卡号字符 | 算式 | 结果 | 处理后 |
|---|---|---|---|---|
| 1 | 6 | - | - | 6(偶数位,直接加) |
| 2 | 2 | 2 × 2 | 4 | 4(奇数位,翻倍后加) |
| 3 | 6 | - | - | 6(偶数位,直接加) |
| 4 | 2 | 1 × 2 | 2 | 2(奇数位,翻倍后加) |
| 5 | 0 | - | - | 0(偶数位,直接加) |
| 6 | 4 | 4 × 2 | 8 | 2(奇数位,翻倍后加) |
| 7 | 8 | - | - | 8(偶数位,直接加) |
| 8 | 1 | 1 × 2 | 2 | 2(奇数位,翻倍后加) |
| 9 | 0 | - | - | 0(偶数位,直接加) |
| 10 | 6 | 6 × 2 | 12 | 1+2=3(奇数位,翻倍后加) |
| 11 | 7 | - | - | 7(偶数位,直接加) |
| 12 | 5 | 1 × 2 | 10 | 1+0=1(奇数位,翻倍后加) |
| 13 | 8 | - | - | 8(偶数位,直接加) |
| 14 | 8 | 8 × 2 | 16 | 1+6=7(奇数位,翻倍后加) |
| 15 | 3 | - | - | 3(偶数位,直接加) |
| 16 | 4 | 4 × 2 | 8 | 8(奇数位,翻倍后加) |
2)将表中的结果进行相加 4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
3)将偶数位进行相加 6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38
4)将2步和3步加到一起 37 + 38 = 75
5)第4步的结果能被10整除,为合法,否则是非法
小技巧:Luhn算法简化解释
其实"翻倍后两位数相加" 可简化为 "减 9"(比如 12→1+2=3=12-9,16→1+6=7=16-9)
翻倍后若为两位数,直接减 9 等价于 "各位相加"(如 12-9=3,16-9=7),
*** 我们在代码中可直接用doubled - 9,无需判断位数。