PTA查验身份证,测试点0

测试点0一直通不过,代码:

num = int(input())
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
exam = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
dic = {}
k = 0
for i in range(num):
    IDN = input()
    dic[IDN] = True
    IDLs = list(IDN)
    target = IDLs.pop(-1)
    try:
        IDLn = list(map(int, IDLs))
        prod = list(map(lambda a, b: a * b, IDLn, weight))
        prod = sum(prod)
        prod = prod % 11
        if IDN[17] == exam[prod]:
            dic[IDN] = False
            k = k + 1
    except ValueError:
        pass
if k == num:
    print("All passed")
else:
    for i in dic:
        if dic[i]:
            print(i)

img

“Devil组”引证GPT后的撰写:
修改的几个问题:

输入的身份证号码应该是18位,而不是17位。因此,第3行的权重列表应该包含18个元素,而不是17个。

在计算身份证号码校验码时,应该将计算得到的值与校验码进行比较,而不是与身份证号码的最后一位进行比较。因此,第14行应该改为:

if exam[prod] == target:


输入的身份证号码可能会包含非数字字符,例如字母。在这种情况下,将无法将非数字字符转换为整数,并且代码将引发ValueError异常。因此,应该将try语句的位置更改为内部循环中,以便在转换失败时继续进行下一个循环。例如:

for i in range(num):
    IDN = input()
    dic[IDN] = True
    IDLs = list(IDN)
    target = IDLs.pop(-1)
    try:
        IDLn = list(map(int, IDLs))
        prod = list(map(lambda a, b: a * b, IDLn, weight))
        prod = sum(prod)
        prod = prod % 11
        if exam[prod] == target:
            dic[IDN] = False
        else:
            raise ValueError
    except ValueError:
        pass


当所有身份证号码都通过验证时,应该输出"All passed",而不是"ALL passed"。因此,第19行应该改为:

print("All passed")


通过这些修改后,代码应该能够通过OJ的测试。