身份证验证,输出正确身份证号的个数

居民身份证是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)