身份证有效性验证
程序员文章站
2022-03-05 13:19:23
题目描述请写代码校验第二代身份证号码有效性。程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效。第二代身份证号组成规则:a) 身份证号码(18位)= 地址码(6)+ 出生日期码(8)+ 顺序码(3)+校验码(1);b) 地址码:保证位数合法即可,无需校验合法性;c) 出生日期码:格式为YYYYMMDD,需校验日期有效性;d) 顺序码:男性为奇数,女性为偶数;e) 校验码:S = ∑(i = 1, 17) { A[i] * W[i] }Y = S % 11校验码 N...
题目描述
请写代码校验第二代身份证号码有效性。程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效。
第二代身份证号组成规则:
a) 身份证号码(18位)= 地址码(6)+ 出生日期码(8)+ 顺序码(3)+校验码(1);
b) 地址码:保证位数合法即可,无需校验合法性;
c) 出生日期码:格式为YYYYMMDD,需校验日期有效性;
d) 顺序码:男性为奇数,女性为偶数;
e) 校验码:
S = ∑(i = 1, 17) { A[i] * W[i] }
Y = S % 11
校验码 N = (12 - Y) % 11
所以N取值范围是0-10,10在身份证号码中用大写字母’X’表示
i:表示号码字符从左至右不包括校验码字符在内的位置序号
A[i]:表示第i位置上的身份证号码字符值
W[i]:表示第i位置上的加权系数,其数列为7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
ins = input()
#ins = '110101199003071938 Male'
ink = ins.split()
strnum = list(ink[0])
sex = ink[1]
l = len(strnum)
xishu = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
def zhuanhaun(strnum):
strnum = int(''.join(strnum))
return strnum
def jiaoyan(strnum):
S = 0
for i in range(l-1):
strnum[i] = eval(strnum[i])
S = S + xishu[i] * strnum[i]
Y = S % 11
N = (12 - Y) % 11
if N == 10:
N = 'X'
return str(N)
if l == 18:
if zhuanhaun(strnum[6:10])<2021 and zhuanhaun(strnum[6:10])>1900 and zhuanhaun(strnum[10:12])<=12 and zhuanhaun(strnum[10:12])>0 and zhuanhaun(strnum[12:14])<=31 and zhuanhaun(strnum[12:14])>0:
if (sex == 'Female' and zhuanhaun(strnum[14:17]) % 2 ==0) or (sex == 'Male' and zhuanhaun(strnum[14:17]) % 2 != 0):
if strnum[17] == jiaoyan(strnum):
print('Pass')
else:
print('Fail')
else:
print('Fail')
else:
print('Fail')
else:
print('Fail')
本文地址:https://blog.csdn.net/wty98wzq/article/details/107635078