我国身份证号码有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("请重新输入")'''