身份证有效性验证

题目描述
请写代码校验第二代身份证号码有效性。程序接收一个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') 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值