#Z01756. 小郭学长的普通身份证 Warning:劝退警告

    ID: 1584 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>ACM综合提升 正则表达式🔨传统题

小郭学长的普通身份证 Warning:劝退警告

题目描述

身份证有以下要求: 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码;  3.第5、6位数字表示:所在区县的代码; 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码; 6.第17位数字表示性别:奇数表示男性,偶数表示女性; 第18位数字是校检码

我们要考虑的有

#首先你得确定是不是18位数据,其次,前面17位不可能出现字母 最后一位除了大写的X都是错的。中间不应该出现空格的情况。

1.省份代码是否合规(你不可能是外星来的吧)

11 : 北京  12 : 天津  13 : 河北    14 : 山西  15 : 内蒙古   21 : 辽宁  22 : 吉林  23 : 黑龙江  31 : 上海  32 : 江苏   33 : 浙江  34 : 安徽  35 : 福建    36 : 江西  37 : 山东   41 : 河南  42 : 湖北  43 : 湖南    44 : 广东  45 : 广西      46 : 海南   50 : 重庆  51 : 四川  52 : 贵州    53 : 云南  54 : 西藏   61 : 陕西  62 : 甘肃  63 : 青海    64 : 宁夏  65 : 新疆   71 : 台湾  81 : 香港  82 : 澳门    91 : 国外

小郭学长很贴心的为你们准备了对应的表:

'11', '12', '13', '14', '15', '21','22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50', '51', '52', '53', '54', '61', '62','63', '64', '65', '71', '81', '82', '91'

'BeiJing','TianJing','HeBei','ShanXi','NeiMengGu','LiaoNing','JiLing','HeiLongJiang','ShangHai','JiangSu', 'ZheJiang','AnHui','FuJian','JiangXi','ShanDong','HeNan','HuBei','HuNan','GuangDong', 'GuangXi','HaiNan','ChongQing','SiChuan','GuiZhou','YunNan','XiZang','ShanXi','GanSu','QingHai', 'NingXia','XingJiang','TaiWan','XiangGang','AoMen','GuoWai'

2.我们这里就不考虑城市和区县了(嘤嘤嘤) 3.出生年月日必须是合法的,考虑0001-9999范围,注意闰年的判断(你可以用if或者正则) 闰年:能被400整除或者能被4整除但不被100整除的年份 正则表达提示: 月份和日期(平年): ((((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))) 年份(0001-9999): (([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1})|([0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})) 闰年年份: (([0-9]{2})(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[3579][26])00)

4.派出所代码略过(嘤嘤嘤) 5.第17位数字奇数表示男性,偶数表示女性; 6.最后一位是校验码,是根据前面十七位数字码,按照一定规则计算出来的检验码。

计算规则如下:

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为: 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 2、将这17位数字和系数相乘的结果相加; 3、用加出来和除以11,看余数是多少; 4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为 '1','0','X','9','8','7','6','5','4','3','2' 5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。如果余数是10,身份证的最后一位号码就是2;

输入格式

每一行一个字符串,不会超过30个,行尾没有空格,但行首和中间不保证没有空格 假设正确的身份证年份处于0001-9999之间

输出格式

对输入的每一行代码判断,只要有1条性质无法满足,就会输出“NO” 如果正确,依次输出"YES"和省份简写,中间以空格隔开

362523200005267217
36252320000526721X
62292319820608261X
431125198808282056
4 1125198808282056
4X1125198808282056
YES JiangXi
NO
YES GanSu
YES HuNan
NO
NO

提示

出题人:Dash_Guo 郭程 计算1801