Python计算身份证第18位(校验码)来判断身份证是否输入正确
前言
- 身份证编码规则如下:根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
- 顺序码(身份证第十五位到十七位)是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:005的就是个男生,而且和他同年月日生的男生至少有两个,他们的后四位是001*和003*。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。
- 校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。
- 从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位。前6位为地址码;第七位至14位为出生日期码,此码由6位数改为8位数,其中年份用4位数表示;第15位至17位为顺序码,取消了顺序码中对百岁老人使用的特定编号;第十八位为校验码,主要是为了校验计算机输入公民身份证号码的前17位数字是否正确,其取值范围是0至10,当值等于10时,用罗马数字符X表示。
校验码计算方法
- 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
- 将这17位数字和系数相乘的结果相加。
- 用加出来和除以11,看余数是多少?
- 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。
- 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
例如:某女性的身份证号码是220202202002020022。我们要看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和是98,然后用98除以11得出其余数是10。最后通过对应规则就可以知道余数10对应的数字是2。所以,可以判定这是一个合格的身份证号码。
用Python实现
lis = list(input('请输入身份证号码:'))
ten = ['X', 'x', 'Ⅹ']
ID = ["10" if x in ten else x for x in lis] #将罗马数字Ⅹ和字母X替换为10
W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
Checkcode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
sum = 0
for i in range(17): #https://blog.zeruns.com
sum = sum + int(ID[i]) * W[i]
if Checkcode[sum % 11] == int(ID[17]):
print('输入正确')
else:
print('输入错误')
9 条评论
我的3.5.2的版本噢
你现在还在吗?这个执行不了⌇●﹏●⌇
自己看报错信息,看看是不是自己打错了,我发出来的都经过测试肯定没问题的
哈哈,好开心你回我了,我试了几次这里说没有sum……咱们也不知道咋回事嘿嘿
直接复制进去运行试试,刚刚我又检查了一遍,代码肯定没错,你的Python版本是多少,要Python3
你的那个身份证号码我输是对的,但是53010219200508011为啥出不来
身份证都输少一位了
好吧,后面还有一个x,但是我也试输过了鸭ヾ(≧∇≦*)ゝ
咦,这里不可以发图片吗