编程实现对一个有效身份证号码的验证,规则如下:
1.将身份证号码前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为: 7 9105842163 7910 5842
2.将这17位数字和系数相乘的结果相加。计算出来的和除以11,看余数是多少?3.余数只可能有0 1234 567 8 9 10这11个数字,其分别对应的最后-位身份证的号码为10 X987654 32。即如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。如果余数是10,身份证的最后一-位号码就是2。
你题目的解答代码如下:
def check_id_data(n):
var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
var_id=['1','0','x','9','8','7','6','5','4','3','2']
sum = 0
for i in range(0,17):
sum += int(n[i])*var[i]
sum %= 11
return var_id[sum]==str(n[17])
n = input("请输入18位身份证号:")
if len(n) != 18:
print("长度错误")
elif not n[0:17].isdigit():
print("有无效字符")
elif not check_id_data(n):
print("校验码错误")
else:
print("校验码正确")
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
判断是否有效:
def isValid(id18:str)->bool:
assert(len(id18)==18)
res = '10X98765432'
ids = list(map(int,id18[:-1]))
x = list(map(int,'79058421637905842'))
for i,n in enumerate(x):
if n==0: x[i]=10
n = sum(ids[i]*x[i] for i in range(17))%11
return res[n]==id18[-1]
print(isValid('320583200207081231')) #虚构的号码
修改一下,已知17位求最后一位:
def lastNum(id17:str)->str:
assert(len(id17)==17)
res = '10X98765432'
ids = list(map(int,id17))
x = list(map(int,'79058421637905842'))
for i,n in enumerate(x):
if n==0: x[i]=10
n = sum(ids[i]*x[i] for i in range(17))%11
return res[n]
print(lastNum('32058320020708123'))