居民身份证是18位字符的编码,每个人的编码都是唯一的,校验规则如下:
∑(ai*wi)mod 11 = 1
i表示号码字符从左至右包括校验码字符在内的位置序号;ai表示第i位置上的字符值;Wi表示第
i位置上的加权因子。即将各位上的数值乘上位权之和对11取余,余数为1则表示该编码正确。注意:如果最后一位校验码是"X"或"x",则代表该校验码的数值为10。
各位的权值依次是:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
例如某身份证号码为:370683198901117657,这是正确的编码。
又如某号码为:470683198902117657 这是错误的编码。
样例
输入样例
4
430321200506200105
430321200505070050
430302200512290036
43038120050824012X
输出样例
3
def is_valid_id(id_num):
"""校验id是否合法"""
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
id_num = str(id_num)
if len(id_num) != 18:
return False
sum_num = 0
for idx, i in enumerate(id_num):
if idx == len(id_num) - 1 and i in ['x', "X"]:
sum_num += weight[idx] * 10
else:
sum_num += weight[idx] * int(i)
if sum_num % 11 != 1:
return False
return True
valid_num = 0
for ids in ['430321200506200105', '430321200505070050', '430302200512290036', '43038120050824012X']:
valid_num += is_valid_id(ids)
print('有效身份证个数:', valid_num)
有帮助的话,请点采纳该答案~
可以参考如下代码
def is_true_encoded(id_number):
data_list = list(str(id_number))
data_length = len(data_list)
if id_number.endswith('X') or id_number.endswith('x'):
data_list[data_length - 1] = 10
weight_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
weight_length = len(weight_list)
if data_length != weight_length:
print("输入的身份证号不正确,请重新输入!")
return False
sum = 0
for i in range(0, data_length):
sum += int(data_list[i]) * weight_list[i]
return sum % 11 == 1
def main():
n = int(input())
i = 0
id_number_list = []
while i < n:
id_number_list.append(input().strip())
i += 1
count = 0
for id_number in id_number_list:
if is_true_encoded(id_number):
count += 1
print(count)
main()
def validate_idcard(idcard):
if len(idcard) != 18:
return False
if not idcard[:17].isdigit():
return False
if idcard[17] not in '0123456789Xx':
return False
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_sum = sum([int(idcard[i]) * factors[i] for i in range(17)]) % 11
check_code = '10X98765432'[check_sum]
if check_code.upper() != idcard[17].upper():
return False
return True
idcards = ["123456789012345678", "123456789012345678X", "11010119900307739X", "110101199003077391", "11010119900307739A"]
count = 0
for idcard in idcards:
if validate_idcard(idcard):
count += 1
print(idcard)
print("正确身份证号数量:", count)