校验公式
身份证号一共18位,各个位置上的号码字符值应满足以下公式的校验:
其中, 表示从右到左包括校验码字符在内的位置序号;
表示第个位置上的号码字符值;
表示第个位置上的加权因子,其计算公式为。
加权因子表如下,
18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 |
校验码的计算
当时,,校验公式可写成:
显然,校验码的取值范围是;当取值为10时,用罗马数字X表示。
由校验公式推得,
和的换算关系如下表所示,
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
实例
某公民身份证号本体码为51078107010228001,其校验码计算过程如下,
,即为6。
查表得校验码为6。
该公民身份证号为510781070102280016。
代码
判断身份证号是否有误
"""判断身份证号是否有误"""
def fun1():
string=input("请输入身份证号:")
if len(string)!=18:
print("输入的身份证号位数错误!")
return
list=[]
for i in string:
if i=='X':
i='10'
list.append(int(i)) #列表解析法,将字符串转换为整型数字
num=0
for i in range(0,18):
num+=list[17-i]*(2**i%11)
if num%11==1:
print("身份证号无误。")
else:
print("身份证号有误!")
fun1()
计算身份证号的校验码
"""计算身份证号的校验码"""
def fun2():
string=input("请输入身份证号前17位:")
if len(string)!=17:
print("请输入身份证号的前17位!")
return
list=[int(i) for i in string] #列表解析法,将字符串拆分为整型数字
num=0
for i in range(1,18):
num+=list[17-i]*(2**i%11)
rem=num%11
a=(12-rem)%11
a=str(a)
if a=='10':
a='X'
print("校验码为"+a)
fun2()