欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

身份证有效性验证

程序员文章站 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

相关标签: python 列表