合法身份证号由 17 位区域、日期编号和序列号加上 1 位校验位组成。校验码的计算规则如下:
首先对前17位进行加权求和身份证上的校验码是什么作用,权重分布为:{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 然后计算的和取模11得到值Z;最后,Z的值和校验码M对应如下关系:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给出一些身份证号码,请验证验证码的有效性并输出有问题的号码。
输入格式:
输入第一行给出一个正整数 N(≤100) 是输入的 ID 号数。接下来的 N 行,每行给出一个 18 位的 ID 号。
输出格式:
按输入的顺序每行输出 1 个有问题的 ID 号。这里不检查前17位是否合理,只检查前17位是否都是数字和后1位校验码是否计算准确。如果所有数字都正常身份证上的校验码是什么作用,则输出全部通过。
输入样本 1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
样本输出 1:
12010X198901011234
110108196711301866
37070419881216001X
输入样本 2:
2
320124198808240056
110108196711301862
样本输出 2:
All passed
C++代码实现如下:
#include
#include
using namespace std;
int main()
{
char ids[20];
int password[17] = { 7, 9, 10, 5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char judge[11] = { '1','0','X','9','8','7','6','5','4','3','2' };
int sum = 0;
int flag = 0;
int n;
cin >> n;
while (n--)
{
for (int i = 0; i < 18; i++)
{
cin >> ids[i];
}
for (int i = 0; i < 17; i++)
{
sum += (int)(ids[i] - '0') * password[i];
}
sum %= 11;
if (judge[sum] != ids[17])
{
flag = 1;
for (int i = 0; i < 18; i++)
{
printf("%c", ids[i]);
}
printf("\n");
}
sum = 0;
}
if (!flag)
{
printf("All passed\n");
}
}