python解决身份证有效位验证

编程题 8. 身份证号码有效性检验
python
【问题描述】

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

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

【评分标准】


coe =[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]  
tail = '10X98765432'
card = input(">>>")
s = sum(map(lambda x:coe[x[0]] * int(x[1]), enumerate(card[:17])))
res = tail[s % 11]
if res == card[-1]:
    print("Valid")
else:
    print("Invalid checksum")
    print(card[:17] + res)

def check_id(id_number: str) -> str:
    factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    id_number_sum = 0
    for i in range(0, 17):
        id_number_sum += int(id_number[i]) * factor[i]
    remainder = str(id_number_sum % 11)
    check_dict = {'0': '1',
                  '1': '0',
                  '2': 'X',
                  '3': '8',
                  '4': '9',
                  '5': '7',
                  '6': '6',
                  '7': '5',
                  '8': '4',
                  '9': '3',
                  '10': '2',
                  }
    if check_dict[remainder] == id_number[-1]:
        return 'Valid'
    else:
        return f'Invalid checksum\n{id_number[:-1]}{check_dict[remainder]}'


if __name__ == '__main__':
    print(check_id('610102199001011215'))
    print(check_id('21010219800425609X'))

>>> def checkid(pid):
    sum = 0
    w = (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
    for i in range(17):
        sum += int(pid[i]) * w[i]
    checksum = '10X98765432'[sum%11]
    if checksum == pid[-1]:
        print('Valid')
    else:
        print('Invalid checksum')
        print('%s%s'%(pid[:17], checksum))

        
>>> checkid('610102199001011215')
Valid
>>> checkid('21010219800425609X')
Invalid checksum
210102198004256091

https://jiangongfang.blog.csdn.net/article/details/121815334