目录
- 1. 身份证查验问题
- 2. 计数踢出问题
- 3. 针对第一问的修改
1. 身份证查验问题
⼀个合法的身份证号码由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)是输⼊的身份证号码的个数。随后行,每行给出1个18位身份证号码。
输出格式:
按照输⼊的顺序每行输出1个有问题的身份证号码。这⾥并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
由上述题目关系,得出代码如下:
n = int(input('请输入要验证身份证号码个数:'))
r_check = [1,0,'x',9,8,7,6,5,4,3,2]
check = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
# 输入n个身份证循环程序
iddata = []
i = 0
for i in range(1,n+1):
idlist = list(map(int,input('请输入第 {} 个身份证:'.format(i))))
iddata.append(idlist)
# 完成身份证输入,此时每个身份证号码都是列表,其中每个数字也是二重列表元素
# 遍历检验输出程序
for i in range(1,n+1):
wrong = 0
sum_check = 0
for j in range(0,17):
sum_check += iddata[i-1][j] * check[j]
n_check = sum_check % 11
if iddata[i-1][17] == r_check[n_check]:
continue
else:
print('第 {} 个身份证号码输入有误,其值为:'.format(i))
a = [str(b) for b in iddata[i-1]]
c = int(''.join(a))
print(c)
wrong += 1
if wrong == 0:
print('恭喜,全部通过')
这里,由于身份证不方便暴露的原因,只给出凑出来的输出结果:
请输入要验证身份证号码个数:2
请输入第 1 个身份证:230803197906010035
请输入第 2 个身份证:123456123456123456
第 2 个身份证号码输入有误,其值为:
123456123456123456
请输入要验证身份证号码个数:1
请输入第 1 个身份证:230803197906010035
恭喜,全部通过
在后期检查的时候,发现有个问题:即由于代码第10行使用了一个map(int,list)
函数,所以在实际使用中不能打入带有x的身份证,目前正在想比较好的办法更改。
2. 计数踢出问题
有30⼈围成⼀圈,从1到30依次编号。每个人开始报数,报到9的自动离开。当有人离开时,后⼀个人开始重新从1报数,以此类推。求离开的前10人编号。
由此,给出Python代码如下:
people = int(input('请输入玩游戏的人数:'))
circle = list(range(1,people+1))
n = 1
i = 9
while n <= people:
while i <= len(circle) - 1:
circle_pop = circle.pop(i-1)
print('第 {0} 个离开的人编号为 {1}'.format(n,circle_pop))
if i == 0: # 千年虫
i += 1
n += 1
i += 8
else:
i -= len(circle)
此处,给出人数为30人时的输出结果:
请输入玩游戏的人数:30
第 1 个离开的人编号为 9
第 2 个离开的人编号为 18
第 3 个离开的人编号为 27
第 4 个离开的人编号为 6
第 5 个离开的人编号为 16
第 6 个离开的人编号为 26
第 7 个离开的人编号为 7
第 8 个离开的人编号为 19
第 9 个离开的人编号为 30
第 10 个离开的人编号为 12
第 11 个离开的人编号为 24
第 12 个离开的人编号为 8
第 13 个离开的人编号为 22
第 14 个离开的人编号为 5
第 15 个离开的人编号为 23
第 16 个离开的人编号为 11
第 17 个离开的人编号为 29
第 18 个离开的人编号为 17
第 19 个离开的人编号为 10
第 20 个离开的人编号为 2
第 21 个离开的人编号为 28
第 22 个离开的人编号为 25
第 23 个离开的人编号为 1
第 24 个离开的人编号为 4
第 25 个离开的人编号为 15
第 26 个离开的人编号为 13
第 27 个离开的人编号为 14
第 28 个离开的人编号为 3
第 29 个离开的人编号为 20
第 30 个离开的人编号为 21
2020/9/30更新
3. 针对第一问的修改
经过查询代码,发现在定义的时候将身份证号码每一位都转化成了int
类型,所以对于某些身份证号码中最后一位的'x'
并不适用,于是将代码改成了:
n = int(input('请输入要验证身份证号码个数:'))
r_check = [1,0,'x',9,8,7,6,5,4,3,2]
check = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
# 输入n个身份证循环程序
iddata = []
i = 0
for i in range(1,n + 1):
idin = input('请输入第 {} 个身份证:'.format(i))
idlist = list(map(int,idin[0:17])) + list(idin[17])
iddata.append(idlist)
# 完成身份证输入,此时每个身份证号码都是列表,其中每个数字也是二重列表元素
# 遍历检验输出程序
for i in range(1,n+1):
wrong = 0
sum_check = 0
for j in range(0,17):
sum_check += iddata[i - 1][j] * check[j]
n_check = sum_check % 11
if str(iddata[i - 1][17]) == str(r_check[n_check]):
continue
else:
print('第 {} 个身份证号码输入有误,其值为:'.format(i))
for k in iddata[i - 1]:
print(str(k),end = '')
print('')
# a = [str(b) for b in iddata[i-1]]
# c = int(''.join(a))
# print(a)
wrong += 1
if wrong == 0:
print('恭喜,全部通过')
经过测试,得到其输出:
请输入要验证身份证号码个数:2
请输入第 1 个身份证:522428196503010833
请输入第 2 个身份证:52242819650301083x
第 2 个身份证号码输入有误,其值为:
52242819650301083x
于是,可认为该代码功能正确。