验证身份证号

时间限制: 1000 ms 内存限制: 65536 kb
总通过人数: 1116 总提交人数: 1273

题目介绍

中华人民共和国公民的身份证号码由 $18$ 位数字或 $X$ 组成,其中最后一位可能是 $X$。

身份证号码的前 $6$ 位表示行政区划代码,第 $7$ 位到第 $14$ 位表示出生日期,第 $15$ 位到第 $17$ 位表示顺序码,第 $18$ 位表示校验码。

现给定若干个身份证号,请检验身份证号是否合法。如果合法,输出 YES,否则输出 NO

保证前 $17$ 位数字合法,因此你只需要检验第 $18$ 位校验码是否合法即可。

校验码的计算方法如下:

  • 将前面的身份证号码 $17$ 位数分别乘以不同的系数。从第 $1$ 位到第 $17$ 位的系数分别为$7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2$。
  • 将这 $17$ 位数字和系数相乘的结果相加。
  • 用加出来的和除以 $11$,看余数是多少。
  • 余数只可能有 $0,1,2,3,4,5,6,7,8,9,10$ 这 $11$ 个数字。其分别对应的最后一位身份证的号码为 $1,0,X,9,8,7,6,5,4,3,2$ 。(即余数 $0$ 对应 $1$ ,余数 $1$ 对应 $0$ ,余数 $2$ 对应 $X$ ...)

输入格式

共 $n+1$ 行。

第一行一个正整数 $n$ ,保证 $1\le n \le 50$ 。

接下来 $n$ 行,每一行为一个身份证号。(若最后一位为 $X$,则为大写字母 X

输出格式

输出 $n$ 行。

每行表示身份证号码是否合法。如果合法,输出 YES,否则输出 NO

输入样例

2
371311200312247819
130631197601191234

输出样例

YES
NO

Hint

在计算系数相乘结果之和时,除了直接写出表达式以外,我们也可以采用 “数组+循环” 的方式。

假设需要计算 $3×5+9×7+4×9$

我们可以直接写 sum = 3*5+9*7+4*9;

同时,我们也可以写成

int a[3] = {3,9,4};
int b[3] = {5,7,9};
int sum = 0;
for (int i = 0; i < 3; ++i) 
{
   sum += (a[i] * b[i]);
}

看似代码量变大了,但如果需要计算 $17$ 个系数相乘结果之和时,“数组+循环”的方法或许会更便捷且不易出错。

相关推荐