挑战 | 身份证号校验

Copyright 2019 HisenZhang

2013年开始中国全面使用第二代居民身份证. 目前我国公民身份证号码由18位数字组成: 前6位为地址码, 第7至14位为出生日期码, 第15至17位为顺序码, 第18位为校验码. 其中第18位校验码用于快速检测身份证号是否合法(以防止输入错误等情况).

校验过程如下:

  1. 将身份证号逐位乘以对应的权重, 其中X表示数字10.
  2. 对上一步的结果求和
  3. 将校验和对11取模 mod 11
  4. 如果结果为1, 则该身份证号合法.

上述权重规定于中华人民共和国国家标准GB11643-1999.

在这个挑战里, 你需要编写一个程序来检验输入的身份证号是否合法.

这里以身份证号11010519491231002X为例, 演示上述过程.

1
2
3
序号 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 
权重 07 09 10 05 08 04 02 01 06 03 07 09 10 05 08 04 02 01
号码 01 01 00 01 00 05 01 09 04 09 01 02 03 01 00 00 02 10
  1. 乘以权重并求和
    $$
    7\cdot1+9\cdot1+ …+1\cdot10 = 177
    $$

  2. 11取模
    $$
    177 \mod11 = 1
    $$

因为结果为1, 该身份证号有效.

样例

从标准输入接收一个身份证号码. 如果该输入是有效号码则输出VALID字样. 否则输出INVALID.

输入样例 1

1
11010519491231002X

输出样例 1

1
VALID

输入样例 2

1
330301194912310021

输出样例 2

1
INVALID

完成度

本挑战的完成度分为两个等级

  1. 可以求出校验和
  2. 可以输出样例中的期望结果

目标

  1. 强化数据类型和类型转换
  2. 强化列表与字符串的操作
  3. 强化四则运算的编程
  4. 强化条件/循环语句

材料

访问OneDrive以获取相关材料

  1. 中文维基文库:
    • GB_11643-1999.pdf

提示

  1. 字符串对象可以视作列表来操作