求赐教~~~身份证校验
身份证有效性校验。一个合法的中国居民身份证号码有18位,其中前6位为地区编号,第7-14位为出生日期,第15-17位为登记流水号,其中第17位是偶数为女性,是奇数则为男性,第18位为校验码。校验码的生成规则请见后面的备注。请设计编写程序,输入18位身份证,判断其合法性,此程序我们判断两个方面的合法性,
一是长度是否是18位,并且前17位均为数字,如果不合法请给出相应提示;
二是判断最后一位校验码是否正确(注意处理字母大小写的问题),如果不合法请给出相应提示;不判断地区、生日的合法性。
如果输入的身份证非法,请用户重新输入,若输入3次仍为非法的身份证号,则结束程序,输出“输入的身份证号无法识别”。如果身份证有效,判断持有人的性别,并输出“身份证有效,持有人的性别为XX”,程序结束。能用函数实现的最好多写函数。
提示:可定义两个元组 factor、last。
factor= (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
last=(“1”,”0”,”x”,”9”,”8”,”7”,”6”,”5”,”4”,”3”,”2”)
备注:身份证的校验码生成规则:
将身份证17位本体码各位数字乘以对应加权因子并求和,除以11得到余数,根据余数通过校验码对照表查得校验码。
万分感谢!!!
你好,时间仓促,没有特别测试。
有问题欢迎追问
'''中国居民身份证号码合法性检验'''
def length_check(numbers):
if len(numbers) == 18:
return True
else:
return False
def factors_check(factors):
return ''.join(factors).isdigit()
def checkcode_check(factors, last):
sum = int(factors) * 7 + int(factors) * 9 + int(factors) * 10 + int(factors) * 5 + \
int(factors) * 8 + int(factors) * 4 + int(factors) * 2 + int(factors) * 1 + \
int(factors) * 6 + int(factors) * 3 + int(factors) * 7 + int(factors) * 9 + \
int(factors) * 10 + int(factors) * 5 + int(factors) * 8 + int(factors) * 4 + \
int(factors) * 2
right = sum % 11
if last == 'X' or last == 'x':
if right == 2:
return True
else:
return False
else:
if right == int(last):
return True
else:
return False
def output(ID_numbers):
if int(ID_numbers) % 2 == 0:
gender = "女"
else:
gender = "男"
print("身份证有效,持有人的性别为" + gender)
def legal_check():
times = 0
legality_flag = True
while times < 3:
legality_flag = True # True represents that it is legal.
times += 1
ID_numbers = input("请输入您的18位身份证号: ")
ID_numbers = list(ID_numbers)
factors = ID_numbers[:-1]
last = ID_numbers[-1]
# check whether the length is 18 digits
if not length_check(ID_numbers):
legality_flag = False
print("输入的号码总长度不为18.")
continue
# check whether the factors are all numbers
if not factors_check(factors):
legality_flag = False
print("前17位不全是数字。")
continue
# check whether the last check code is read correctly
if (last != 'X' and last != 'x') and not last.isdigit():
legality_flag = False
print("最后一位应为数字,或'X'、'x'.")
continue
# check the legality of the checkcode
if not checkcode_check(factors, last):
legality_flag = False
print("最后一位校验码不正确")
continue
if legality_flag:
output(ID_numbers)
break
if not legality_flag:
print("输入的身份证号无法识别")
legal_check() factor= (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
check_code = ('1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2')
def base_check(str_id):
if len(str_id) != 18:
print("输入的号码总长度不为18.")
return False
elif not str_id[:17].isdigit():
print("前17位不全是数字。")
return False
return True
def identity_check(str_id):
sum = 0
for index, num in enumerate(str_id[:17]):
sum += int(num) * factor
mod = sum % 11
return str_id.lower() == check_code
def main():
times = 3
while times:
ID_numbers = input("请输入您的18位身份证号: ")
if not base_check(ID_numbers):
times -= 1
continue
elif not identity_check(ID_numbers):
print("最后一位校验码不正确")
times -= 1
continue
else:
break
if not times:
print("输入的身份证号无法识别")
else:
sex= '男' if int(ID_numbers) % 2 != 0 else '女'
print("身份证有效,持有人的性别为{0}".format(sex))
if __name__ == '__main__':
main() 码了这么多代码,也没混上个最佳答案,真是悲哀{:10_266:}
页:
[1]