欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python3 理解(46 身份证号码校验)

程序员文章站 2024-01-29 19:23:40
...

身份证号码校验

【问题】目前使用的身份证号码是18位的。如果在需要输入身份证的时候,随便编一个数字上去,十有八九是不能通过的。因为,这18位编码要符合一定的校验规则。
具体地说,把18位编码的每一位乘以一个权值加起来,总和对11求模,结果必须为1。
身分证编码的前17位数必需是数字,最后一位是校验位,可能是数字,也有可能是X,代表10。
请编程对已知的身份证号校验是否合格。

分析:
这个需求很明确,问题给出的描述基本就是算法了。

### 身分证号码校验
### 各位的权值 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1]
def idCardCheck(s):
	def v(s):
		if s == 'x' or s == 'X': return 10
		return ord(s) - ord('0')
		
	w = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1]
	t = [ v(a) * b for a,b in zip(s,w) ]
	return sum(t) % 11 == 1

if __name__ == '__main__':
	print(idCardCheck('142322199402264067'))
	print(idCardCheck('14232219940226406X'))
	print(idCardCheck('44188119930305693x'))

如果我们想从前17位,求校验位,如何实现呢?
因为校验位只可能是11个符号中的某一个,可以使用枚举法,逐一列出11种情况就可以。
因为计算规模很小,下面用个“流氓手法”,把所有可能的校验值全试一遍,碰上谁算谁。

### 身分证号码校验
### 各位的权值 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1]
def idCardCheck(s):
	def v(s):
		if s == 'x' or s == 'X': return 10
		return ord(s) - ord('0')
		
	w = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
	t = sum([ v(a) * b for a,b in zip(s,w) ])

	for i in range(10):
		if (t + i) % 11 == 1: return str(i)
	return 'X'

if __name__ == '__main__':
	print(idCardCheck('14232219940226406'))
	print(idCardCheck('44188119930305693'))