Python || 身份证号校验

我国身份证号码有18位,排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。 其中:

1.地址码

表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。

2.出生日期码

表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

3.顺序码

表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

4.校验码

其值可以是数字或字母X。校验方法如下:

(1)将身份证号码前17位数分别乘以不同的系数:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)将上述17个相乘的结果求和,然后除以11,获得余数

(3)余数0 1 2 3 4 5 6 7 8 9 10分别对应身份证号码的最后一位为1 0 X 9 8 7 6 5 4 3 2

例如:某身份证号码是210102198004256032,校验其正确性的过程如下:

首先:计算2*7+1*9+0*10+1*5+...+3*2,前17位的乘积和是230

然后:用230除以11余数为10

最后:余数10对应的校验位数字是2,因此,这是一个合格的身份证号码。

请编写一个程序,对用户输入的身份证号码进行校验,合格则输出Yes,并输出出生日期和性别。不合格则输出No。

输入样例1:

210102198004256032

输出样例1:

Yes

出生日期:1980年04月25日

性别:男

输入样例2:

21010219800425609X

输出样例2:

No

id = input()

W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

sum = 0  # 前17位累加和
for i in range(0, 17):
    sum += int(id[i]) * W[i]

if id[17] != check[sum % 11]:
    print("No")
else:
    print("Yes")
    year = id[6:10]
    month = id[10:12]
    day = id[12:14]

    print("出生日期:" + year + '年' + month + '月' + day + '日')
    if int(id[16]) % 2 == 1:
        print("性别:男")
    else:
        print("性别:女")



'''id_card=eval(input())
jy = id_card[len(id_card)-1:len(id_card)]  # 截取校验位
if len(id_card) == 18:  # 判断输入的身份证号是否为18位
    x= (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
    s=0
    for i in range(1,len(id_card)): # 遍历身份证号
        e = id_card[i-1:i]
        s = s + int(e)*x[i-1]       # 求前17位与加权数相乘的和
    b = s%11
    y=("1","O","X","9","8","7","6","5","4","3","2")
    c = y[b]
    if jy == c:   # 判断校验位是否相同
        print('Yes')
        print('出生日期:{}年{}月{}日‘jy[6:10],jy[10:12],jy[12:14])
    else:
        print('No')
'''


'''import datetime
ID=input()
para=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
P=0
q=[1,0,'X',9,8,7,6,5,4,3,2]
def f(y):
    if y%400==0 or y%100!=0 and y%4==0:
        return True
    else:
        return False
def g(y,m,d):
    date1=datetime.date(y,m,d)
    tf=date1.__le__(datetime.date.today())
    date=[31,28,31,30,31,30,31,31,30,30,31,30]
    if f(y):
        date[1]=29
    if m in range(1,13) and d>=0 and d<=date[m-1] and tf:
        return True
    else:
        return False
try:
    for i in range(17):
        P=P+int(ID[i])*para[i]
    P=P%11
    y,m,d=map(int,(ID[6:10],ID[10:12],ID[12:14]))
    if int(ID[17])==q[P] and g(y,m,d):
        print('身份证号码校验为合法号码')
        print('出生:{}年{}月{}日'.format(y,m,d))
        print('年龄:{}'.format(datetime.date.today().year-y))
        sexi=int(ID[-2])
        sex='男' if sexi%2==1 else '女'
        print('性别:',end='')
        print(sex)
    else:
        print('身份证校验错误')
except:
    print('身份证校验错误')
'''

'''def check_id_length(n):
  if len(str(n)) != 18:
    print("No")
    return False
  else:
    return True
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']
    n = str(n)
    sum = 0
    if int(n[16])%2==0:
      gender="女"
      same=int(int(n[16])/2)
    else:
      gender="男"
      same=int((int(n[16])+1)/2)
    for i in range(0,17):
      sum += int(n[i])*var[i]
    sum %= 11
    if (var_id[sum])==str(n[17]):
        print("Yes")
        print("出生日期:",n[6:10],"年",n[10:12],"月",n[12:14],"日",sep="")
        print("性别:",gender,sep="")
        return sum
    else:
        print("No")
        #print("出生日期:",n[6:10],"年",n[10:12],"月",n[12:14],"日")
        #print("性别:", gender)
        return 0
n = input()
if check_id_length(n):
  check_id_data(n)
else:
  print("请重新输入")'''

你可能感兴趣的:(Python,python)