一:卡号检测
来判断银行卡(储蓄卡,信用卡)的卡号的合法性我们用到了Luhn算法
算法流程如下:
1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….
2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。
3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
4. 如果s能够整除10,则此号码有效,否则号码无效。
因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。
在很多网页上找到的luhn校验都是不全的,缺从后先前数偶数位的处理,只能自己加上了。
def luhn_checksum(card_number):
def digits_of(n):
return [int(d) for d in str(n)]
digits = digits_of(card_number)
odd_digits = digits[-1::-2]
even_digits = digits[-2::-2]
checksum = 0
checksum += sum(odd_digits)
for d in even_digits:
d_0 = 2*d
d_1 = d_0 // 10
d_2 = d_0 % 10
checksum += d_1
checksum += d_2
return checksum % 10