编程题 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