鱼C论坛

 找回密码
 立即注册
查看: 2530|回复: 17

[已解决]校验身份证号码并输出个人信息题求助

[复制链接]
发表于 2020-3-31 12:06:57 | 显示全部楼层 |阅读模式
10鱼币
求解和讲解自己搞了两三天写不对
最佳答案
2020-3-31 12:06:58
本帖最后由 永恒的蓝色梦想 于 2020-3-31 13:01 编辑
  1. A=(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  2. B=('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')

  3. def isValidID(ID):
  4.     return B[sum((int(i)*j for i,j in zip(ID,A)))%11]==ID[17]

  5. def main():
  6.     ID=input()
  7.     if isValidID(ID):
  8.         temp=ID[6:10]
  9.         print(f"身份证号码校验为合法号码!\n出生:{temp}年{ID[10:12]}月{ID[12:14]}日\n年龄:{2020-int(temp)}\n性别:{'男'if int(ID[16])&1 else'女'}")
  10.     else:
  11.         print('身份证校验位错误!')

  12. if __name__=='__main__':
  13.     main()
复制代码
QQ图片20200329174910.png
QQ图片20200329174936.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 12:06:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 永恒的蓝色梦想 于 2020-3-31 13:01 编辑
  1. A=(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  2. B=('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')

  3. def isValidID(ID):
  4.     return B[sum((int(i)*j for i,j in zip(ID,A)))%11]==ID[17]

  5. def main():
  6.     ID=input()
  7.     if isValidID(ID):
  8.         temp=ID[6:10]
  9.         print(f"身份证号码校验为合法号码!\n出生:{temp}年{ID[10:12]}月{ID[12:14]}日\n年龄:{2020-int(temp)}\n性别:{'男'if int(ID[16])&1 else'女'}")
  10.     else:
  11.         print('身份证校验位错误!')

  12. if __name__=='__main__':
  13.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 12:09:22 | 显示全部楼层
描述没截全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:09:49 | 显示全部楼层
我把老师的答案附上
ls = ( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 )
id = input()
sum = 0
for i in range(17):
    sum = sum + ls[i] * int(id[i])
if str(id[17]) == 'X':
    if sum % 11 == 2:
        print('身份证号码校验为合法号码!')
    else:
        print('身份证校验位错误!')
elif (sum % 11 + int(id[17])) % 11 == 1:
    print('身份证号码校验为合法号码!')
else:
    print('身份证校验位错误!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:15:09 | 显示全部楼层
描述如下
中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。
如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:
     1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  2. 将这17位数字和系数相乘的结果相加。
  3. 用加出来和除以11,看余数只可能是:0-1-2-3-4-5-6-7-8-9-10
        分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2
  4. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。
    用户输入一个身份证号,校验其是否是合法的身份证号码,如身份证号码不合法输出 '身份证校验位错误!',如身份证号码合法则分别在4行中输出'身份证号码校验为合法号码!'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:17:48 | 显示全部楼层

描述如下
中国目前采用的是18位身份证号,其第7-10位数字是出生年,11-12位是出生月份,13-14是出生日期,第17位是性别,奇数为男性,偶数为女性,第18位是校验位。
如果身份证号码的其中一位填错了(包括最后一个校验位),则校验算法可以检测出来。如果身份证号的相邻2位填反了,则校验算法可以检测出来。校验规则如下:
     1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  2. 将这17位数字和系数相乘的结果相加。
  3. 用加出来和除以11,看余数只可能是:0-1-2-3-4-5-6-7-8-9-10
        分别对应的最后一位身份证的号码为:1-0-X-9-8-7-6-5-4-3-2
  4. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X(大写英文字母X)。如果余数是10,身份证的最后一位号码就是2。
    用户输入一个身份证号,校验其是否是合法的身份证号码,如身份证号码不合法输出 '身份证校验位错误!',如身份证号码合法则分别在4行中输出'身份证号码校验为合法号码!'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:22:51 | 显示全部楼层
import datetime
ls = ( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 )
id = input()
def IDcheck(id):
    sum = 0
    for i in range(17):
        sum = sum + ls[i] * int(id[i])
    if id[17] == 'X':
        if sum % 11 == 2:
            return 1
        else:
            return 0
    elif (sum % 11 + int(id[17])) % 11 == 1:
        return 1
    else:
        return 0

if IDcheck(id) == 1:
    year = id[6:10]
    month = id[10:12]
    day = id[12:14]
    if int(id[16]) % 2 == 0:
        sex = '女'
    if int(id[16]) % 2 == 1:
        sex = '男'
    print('身份证号码校验为合法号码!')
    print('出生:{}年{}月{}日'.format(year, month, day))
    print('年龄:{}'.format(datetime.datetime.now().year - int(year)))
    print('性别:{}'.format(sex))
else:
    print('身份证校验位错误!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:52:30 | 显示全部楼层

第一题怎么写????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 12:55:17 | 显示全部楼层

讲讲大佬  你的代码性别男女写反了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 12:59:51 | 显示全部楼层
李子豪 发表于 2020-3-31 12:55
讲讲大佬  你的代码性别男女写反了

……我一直以为倒数第二位只有1、2来着……搞错了欸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 13:02:18 | 显示全部楼层
李子豪 发表于 2020-3-31 12:52
第一题怎么写????
  1. A=(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  2. B=('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')

  3. def isValidID(ID):
  4.     return B[sum((int(i)*j for i,j in zip(ID,A)))%11]==ID[17]

  5. def main():
  6.     ID=input()
  7.     if isValidID(ID):
  8.         print(f"身份证号码校验为合法号码!")
  9.     else:
  10.         print('身份证校验位错误!')

  11. if __name__=='__main__':
  12.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 13:04:43 | 显示全部楼层

大佬抱抱给我讲讲嘤嘤嘤
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 13:16:31 | 显示全部楼层
李子豪 发表于 2020-3-31 13:04
大佬抱抱给我讲讲嘤嘤嘤

这个……你哪里不懂?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 19:08:56 | 显示全部楼层
都不懂嘤嘤嘤能不能都讲讲!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-1 10:21:38 | 显示全部楼层

讲讲大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 10:23:31 | 显示全部楼层

讲哪儿啊?还是说你一点不会?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-1 11:12:59 | 显示全部楼层

都不懂分条讲讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 11:18:36 | 显示全部楼层

如果要全讲的话,抱歉,我没那个时间
如果说你要是提出几条疑问的话,我倒是可以给你讲讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-3 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表