酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

居民身份证是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,这是正确的编码。 又比如身份证号:43038120051120041X,这是正确的编码, 还比如身份证号:150402200002010020,这是正确的编码。 又如某号码为:470683198902117657,这是错误的编码。 格式 输入格式 第一行是一个数字n(1≤n≤150),表示后面有n个号码需要判断 从第二行起,每行一个18位的字符串,表示要判断的身份证号码,一共有n行 输出格式 输出一个整数值,表示正确的身份证号码的个数

要解决这个问题,我们需要验证给定的身份证号码是否符合校验规则。具体步骤如下: 1. 检查长度:确保身份证号码长度为18位。 2. 校验字符:前17位必须是数字,最后一位可以是数字或'X'/'x'。 3. 计算加权和:根据给定的权值计算各位的加权和。 4. 验证校验码:计算加权和对11取模的结果,余数应为1。 解决代码 ```python n = int(input()) count = 0 weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1] for _ in range(n): id_num = input().strip() if len(id_num) != 18: continue valid = True total = 0 for i in range(17): if not id_num[i].isdigit(): valid = False break total += int(id_num[i]) * weights[i] if not valid: continue last_char = id_num[17] if last_char.isdigit(): check_value = int(last_char) elif last_char.upper() == 'X': check_value = 10 else: continue if (total + check_value * weights[17]) % 11 == 1: count += 1 print(count) ``` 代码解释 1. 输入处理:读取需要验证的身份证号码数量`n`。 2. 初始化计数器:`count`用于统计有效的身份证号码数量。 3. 权值列表:`weights`存储18位身份证号码的加权因子。 4. 遍历每个身份证号码: - 检查长度是否为18位,不是则跳过。 - 检查前17位是否为数字,不是则标记为无效。 - 计算前17位的加权和。 - 处理最后一位校验码,如果是'X'或'x',则其值为10。 - 验证加权和对11取模的结果是否为1,是则增加计数器。 5. 输出结果:打印有效的身份证号码数量。 注意事项 1. 校验码处理:最后一位可以是数字或'X'/'x',需正确处理其数值。 2. 加权和计算:确保每位数值与对应权值相乘后累加。 3. 取模验证:最终加权和对11取模的结果必须为1才有效。 [2025-05-18 21:23:12 | AI写代码神器 | 562点数解答]

相关提问