编程题 8. 身份证号码有效性检验

【问题描述】

 

我国身份证号码是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

 

并输出含正确校验位的身份证号

 

【评分标准】


# 验证身份证

# 我国身份证号码是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')