一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z
;最后按照以下关系对应Z
值与校验码M
的值:
- Z:0 1 2 3 4 5 6 7 8 9 10
- M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed
。
- 4
- 320124198808240056
- 12010X198901011234
- 110108196711301866
- 37070419881216001X
- 12010X198901011234
- 110108196711301866
- 37070419881216001X
- 2
- 320124198808240056
- 110108196711301862
All passed
- num = int(input())
- numbers = []
- #权重
- weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
- #效验码
- checkCode = {0:'1',1:'0',2:'X',3:'9',4:'8',5:'7',6:'6',7:'5',8:'4',9:'3',10:'2'}
- #完全通过计数器
- cou1 = 0
- #按次输入
- for x in range(0,num):
- numbers.append(input())
- #循环检查
- for x in numbers:
- #身份位数计数器&索引
- index = 0
- sum = 0
- for y in x:
- if index < 17 and y.isdigit() == False:
- print(x)
- break
- #加权求和前17位
- if index < 17:
- sum += int(y) * weight[index]
- index += 1
- if index == 18:
- #对11取模
- Z = sum % 11
- #验证是否有效
- if checkCode[Z] != y:
- print(x)
- index -= 1
- #有效则通过计数器+1
- if index == 18:
- cou1 += 1
- if cou1 == num:
- print('All passed')
以上代码全为本人亲自手敲,可能有一些错误和不足之处,如有更好的方法和建议,欢迎您在评论区友善讨论。