python3 题解(45 卡号校验 Luhn算法)

银行卡号校验

【问题】在自助机上给别人转款,你有没有担心过,万一卡号错了一位,把钱打给不认识的人怎么办呢?其实大可不必这么心累,银行卡的号码并不是连续有效的,它需要符合一定的校验规则,卡号中任何一位发生错误都是一个无效的号码。
这个规则是:Luhn算法。具体地说,把卡号码从后向前分别标为1,2,3…
奇数位的数不变,偶数位的乘以2,如果是2位数,把它的两个数位上数相加。
最后,把这些数求和,如果刚好被10整除,则校验成功。
请编程校验卡号。

分析:
这个问题的处理思路很明确,按要求转为程序即可。

### 银行卡号校验 Luhn算法
def cardCheck(s):
	def f(i,c):
		if i % 2 == 0: return c
		t = c * 2
		if t > 9: t -= 9
		return t

	lst = [f(i,int(c)) for i,c in enumerate(reversed(s))]
	return sum(lst) % 10 == 0

if __name__ == '__main__':
	print(cardCheck('6225760008219524'))
	print(cardCheck('6225760008219525'))

这段码的处理偶数位时,用了点小技巧。如果是2位数,直接减9。
可以证明这个方法效果是一样的。因为如果是两位数,十位必然是1,所以减10,再加1就可以,当然就相当于减9了。

实际上,当情况比较少的时候,用枚举的方法是最可靠的了。
偶数位算法听上去有点烦,实际上只有0-9这10个数字,先心算好,再写死到程序里不是最可靠吗?因为没有 IF,就少了出错的可能。

### 银行卡号校验 Luhn算法
def cardCheck(s):
	def f(i,c):
		if i % 2 == 0: return c
		return [0,2,4,6,8,1,3,5,7,9][c]

	lst = [f(i,int(c)) for i,c in enumerate(reversed(s))]
	return sum(lst) % 10 == 0

if __name__ == '__main__':
	print(cardCheck('6225760008219524'))
	print(cardCheck('6225760008219525'))

需要补基础的,可以看:小甲鱼pyhthon教程,Bilibili站上还有:[耿老师]小甲鱼python作业 解析系列,持续更新中。

你可能感兴趣的:(python)