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'))
上一篇: 课上笔记(六)(Python)
下一篇: 线程知识点