A71991 | 身份证校验
题目描述
填错身份证号会给我们的生活带来很多麻烦,例如无法办理飞机值机。因此,身份证号的设计者在身份证号中藏了一个多余的 “校验位”,能够帮助我们发现一些常见的 “手滑” 类型错误。 中华人民共和国居民身份证号码由 18 位数字组成,包括 17 位主体码和 1 位校验码:
前 6 位为地址码,表示户籍所在地的行政区划代码;
第 7 到 14 位为出生日期,格式为
YYYYMMDD,例如 20250510 表示 2025 年 5 月 10 日;第 15 到 17 位为顺序码,同年同月同日在同一地址码出生的人,用顺序码区分。顺序码奇数分配给男性,偶数分配给女性,即第 17 位为奇数表示男性,为偶数表示女性;
第 18 位为校验位,其中大写
X代表 10。身份证号采用 ISO 7064 : 1983 , MOD 11-2 校验字符系统,当下列算式左侧的计算结果等于 1 时校验通过:
(a_{18}+a_{17} \times 2 + a_{16} \times 2^2 + ... +a_{1} \times 2^{17}) \mod 11 = 1
其中:mod 是除法取余运算。
a_i 表示第 i 位字符的值,例如 a_1 是身份证号的第一位,a_{18} 是身份证号的校验位。
例如,32010620250510001X 是一个合法的身份证号,对应了南京市鼓楼区 (320106) 2025 年 5 月 10 日 (20250510) 出生的男性 (001)。请你编程实现身份证号的校验。在校验位校验通过的基础 上,还进一步要求出生日期必须在 1900 年 1 月 1 日至 2025 年 5 月 10 日之间 (包含首尾两天),并且是一个日历上存在的日期 (例如 1970 年 13 月 1 日是非法日期)。
闰年判断规则为:能被 4 整除的年份为闰年,但能被 100 整除而不能被 400 整除的年份不是闰年 (例如 2000 年是闰年,1900 年不是)。闰年二月有 29 天,平年二月有 28 天。
输入格式
输入第一行为 T,表示待验证的身份证号码数量。接下来的 T 行,每行是一个 18 位字符的字 符串 (保证前 17 位为数字,第 18 位要么是数字,要么是大写字母 X),表示待验证的身份证号码。
输出格式
对于每个身份证号码,输出一行,PASS 表示通过检查,FAIL 表示未通过检查。注意 PASS 和 FAIL 均为大写。
输入输出样例
2 14021320141203937X 140213201412039372
PASS FAIL
数据规模
对于 50 \% 的数据,身份证号的日期总是 1900 年 1 月 1 日 到 2025 年 5 月 10 日之间的合法日期;
对于 100 \% 的数据,满足 T ≤ 10,000。
我们下发了 pass.txt 和 fail.txt 两个样例。pass.txt 中所有身份证号均能通过检查;fail.txt 中所有身份证号均不能通过检查。
附件下载
T4.rar (121.21 KB)
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录AI
作答助手确定要清空代码吗?