爱收集资源网

一个合法的身份证号码由17位地区、日期编号和顺序

网络整理 2022-05-17 03:01

合法身份证号由 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");
    }
}

身份证号码 校验码