昨天圣诞夜,有个学妹问我一个学校作业的Python题目,圣诞节下午抽空写了一下代码,题目不是很难,用简单的语法实现的,注解也详细,写好发给学妹后,想了一下,最近太忙好久没写博客了,写完了顺便把内容发布一下,嘿嘿 ( ? ? ? )
题目:
【问题描述】一个合法的身份证号码由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
现在给定一些身份证号码,请你验证校验码的有效性,这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确,并输出结果。
【输入格式】输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
【输出格式】按照输入的顺序每行输出1个有问题的身份证号码。如果所有号码都正常,则输出All passed。
答案:
def main():
factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
M = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
N = int(input('请输入身份证号数量:'))
if N <= 100:
incorrect_list = []
print('身份证数量:', N)
for i in range(0, N):
id_num = str(input('请输入第' + str(i + 1) + '个身份证号:'))
if len(id_num) == 18:
print('本次输入的身份证号:', id_num)
check_num = id_num[0:17]
last_num = id_num[len(id_num) - 1]
id_sum = 0
correct_flag = True
for j in range(len(check_num)):
if check_num[j].isdigit():
id_sum += int(check_num[j]) * factor[j]
else:
correct_flag = False
break
if correct_flag is False:
incorrect_list.append(id_num)
continue
print('加权求和:', id_sum)
Z = id_sum % 11
print('对11取模值Z:', Z)
if last_num != M[Z]:
incorrect_list.append(id_num)
else:
incorrect_list.append(id_num)
if len(incorrect_list) > 0:
print('以下是错误的身份证号:')
for i in incorrect_list:
print(i)
else:
print('All passed')
else:
print('请输入小于等于100的正整数,请重新输入。')
main()
if __name__ == '__main__':
main()
(`???′+)
以上已经包含了题目所有要求的判断,简洁易懂的语法,如有遗漏,请留言提醒,感谢大佬们 ?ω? 都看完啦,点个赞哈,祝您圣诞快乐! (????)ノ
|