1.题目
身份证号的校验身份证号码共18位,最后一位是校验位A[18] : aaaaaabbbbbbbbcccd
校验的规则是如下:
前十七位的权值分别是: W[17]:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
x=(A[0]*W[0]+A[1]*W[1]+A[2]*W[2]+…+A[16]*W[16]) mod 11
x和校验位y的对应规则对应如下:
x:0 1 2 3 4 5 6 7 8 9 10
y:1 0 x 9 8 7 6 5 4 3 2
若y等于d则身份证号码正确
输出格式:aaaaaabbbbbbbbcccd 正确
若y不等于d则身份证号码不正确
输出格式:应为:aaaaaabbbbbbbbcccy
输入格式: 身份证号码
输出格式: 身份证号码 正确或者不正确
输入样例: 52242619811105565x 输出样例: 52242619811105565x 正确
2. 代码以及解析
- 这个题很简单,主要是为了先验证是否为18位,然后验证校验位
- 代码:
#include <iostream>
using namespace std;
int main()
{
//输入权值数组
int W[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//校验位对照表
char check[] = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
cout << "请输入您的18位身份证号:" << endl;
char A[17] = {'0'};
cin >> A;
//验证输入的身份证号是否为18位
int num = strlen(A);
//cout << num << endl;
if (num != 18) {
cout << "身份证号输入不完全,请再次输入。";
return 0;
}
//创建辅助数组,将前17位存到辅助数组中
int B[17] = {0};
for (int i = 0; i < 17; i++)
B[i] = (int)A[i] - 48;
//计算前17位的权值之和MOD11
int sum = 0;
for (int j = 0; j < 17; j++)
sum += W[j] * B[j];
int x = sum % 11;
int y = check[x] - 48;
if (check[x] == A[17])
{
cout << A;
cout << " "
<< "正确" << endl;
system("pause");
return 0;
}
else
{
for (int i = 0; i < 17; i++)
cout << B[i];
if (check[x] == 'x')
cout << 'x' << endl;
else
cout << y << endl;
system("pause");
return 0;
}
return 0;
}