# 验证身份证
# 我国身份证号码是18位数字和字母X的组合,其中前17位是数字,第18位是校验位,其值可以是数字或字母X
# 第18位的校验方法如下:
# –将身份证号码前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分别对应身份证号码的最后一位为1 0 X 9 8 7 6 5 4 3 2
# 【输入形式】
# 【输出形式】
# 【样例输入】
# 610102199001011215
# 【样例输出】
# Valid
# 【样例输入】
# 21010219800425609X
# 【样例输出】
# Invalid checksum
# 210102198004256091
# 【样例说明】
# 如果校验位错误,会输出Invalid checksum
# 并输出含正确校验位的身份证号
def verify(id):
if (len(id) != 18):
return
x = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
val = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
last = ['1', '0', 'X', '9', '8', ' 7', '6', '5', '4', '3', '2']
ids1 = list(id)
ids = ids1[:-1]
tt = [i * int(j) for i, j in zip(x, ids)]
tt = sum(tt)%11
if ids1[-1] == last.__getitem__(val.index(tt)):
print('valid')
else:
print('Invalid checksum')
ids.append(last.__getitem__(val.index(tt)))
print("".join(ids))
verify('610102199001011215')
verify('21010219800425609X')