有关一道身份证的题目,要求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
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
原题位置
出于撩妹的需要(手动狗头)我昨天晚上写了一下结果十行就有九行的BUG我。。。
于是乎我今天接着搞,总算是把它giao了出来哈哈
这里我的代码比较辣鸡哈哈大伙可能看得比较扎心。。。
##将传来的字符串变成数字组成的列表
def change(idstring):
idlist=list(idstring)
idnum=[]
for i in idlist: ##从此处开始其实我也是查的别人家的代码(尬笑)
try:
m=int(i)
idnum.append(m)
except ValueError:
i=None
return idnum
##判断这个身份证号码符不符合规定
def judge3(idstring): ##为啥叫3呢因为昨天晚上写了俩都是错的(尬笑)
idnum=change(idstring)
for crossz in idnum[0:17]:
if type(crossz)==False:tf=0
break
z=(7*idnum[0]+9*idnum[1]+10*idnum[2]+5*idnum[3]+8*idnum[4]+4*idnum[5]+2*idnum[6]+1*idnum[7]+6*idnum[8]+3*idnum[9]+7*idnum[10]+9*idnum[11]+10*idnum[12]+5*idnum[13]+8*idnum[14]+4*idnum[15]+2*idnum[16])%11
if z==2 and len(idnum)==17:tf=1
elif len(idnum)==18 and z==0 and idnum[17]==1:tf=1
elif len(idnum)==18 and z==1 and idnum[17]==0:tf=1
elif len(idnum)==18 and idnum[17]==12-z:tf=1
else : tf=0
return tf
##输入身份证号并创建列表,这里搞的skr字符串列表毕竟身份证号码里面可能有叉
def key_in():
max=eval(input("how many numbers:"))##告诉程序你要输入多少个身份证号码它先做个心理准备
u=[]
start=0
while start<max: ##循环键入
prim=input().split('\n')
u+=prim
start+=1
return u
##组装前面的代码段,使其结构化
def main():
u=key_in() ##调用输入函数并创建列表
fourze=1 ##这里纯粹是纪念假面骑士fourze(变身?)
for item in u:
fourze*=judge3(item)
if fourze==1:print("All passed")
else:
for items in u:
if judge3(items)==0:print(items)##把不合要求的身份证号码拉出来然后警察叔叔去找人然后抓起来(迷惑行为)
##准备调用了嗷
main()
代码跑一跑发现没啥问题,奶思(此处应有假笑男孩表情包)
晚上就单纯的想着判断函数,然鹅输入的身份证号是个字符串,先要变成数字的列表才能够对每个元素进行运算于是就加一个转化函数。接着我在主框里面自定义了三个身份证号码(我瞎编的嗷),看起来可以跑。现在就是用户的循环输入了,今天就加了一个键入的模式。顺便还看了看大神们的博客,学学split的用法。
组装完成了就把它放到题目的环境里面,并按照要求进行了一点修改,发现还是可以跑的。🆗,问题解决。
这是我自学python做的第一个像模像样的题目,代码可能不太漂亮,各路大神有啥意见建议欢迎交流嘞。。。不喜勿喷嘞。。。
(顺便说一句,把四个函数整理到一个函数似乎也是可以的)
(我程序设计水平真的垃圾,C语言期末才考了68…)
最后再吹一波武汉大学隔壁的关山口男子职业技术学院,妹子超多,欢迎报名(滑稽)
来源:CSDN
作者:飞电或人
链接:https://blog.csdn.net/qq_46253658/article/details/104844703