中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。
如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:
- 将前面的身份证号码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
- 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。
用户输入一个身份证号,校验其是否是合法的身份证号码。
输入格式:
一个18位身份证号,末位为数字或大写字母X
输出格式:
'身份证号码校验为合法号码!' 或 '身份证校验位错误!'
输入样例1:
220221197302286534
输出样例1:
身份证校验位错误!
输入样例2:
220221197305166534
输出样例2:
身份证号码校验为合法号码!
def check_id_number(id_number): if len(id_number) != 18: return False # 校验前17位数字 factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] check_sum = sum(int(id_number[i]) * factors[i] for i in range(17)) check_code = "10X98765432"[check_sum % 11] return id_number[-1] == check_code # 主程序 id_number = input() if check_id_number(id_number): print("身份证号码校验为合法号码!") else: print("身份证校验位错误!")