目录

  • 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

  于是,可认为该代码功能正确。