北京理工大学上机题——身份证验证
题目描述:
身份证号的校验身份证号码共18位,最后一位是校验位A[17]:aaaaaabbbbbbbbccc d校验的规则是如下:
前十七位的权值分别是: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[16]*W[16])mod11
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
533325199108247066
需要解决的问题:
(1)验证输入的身份证的位数,是否是18位;
(2)身份证校验位的确定。
#include<iostream>
using namespace std;
int main() {
char A[18] = { '0' };
cout << "输入身份证号:";
cin >> A;
//验证身份证位数,如果位数不为18则退出
int num = strlen(A);
if (num != 18) {
cout << "身份证号输入错误!" << endl;
exit(1);
}
int W[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char jiaoyan[11] = { '1','0','x','9','8','7','6','5','4','3','2' };
int x = 0;
for (int i = 0;i < 17;i++) {
//计算x,把A中的字符先转换为int型再进行计算
x += (int)(A[i] - '0') * W[i];
}
x = x % 11;
//计算出x对应的y
char y = jiaoyan[x];
if (A[17] == y) {
cout << A << " 正确" << endl;
}
else {
cout << "身份证错误,应为:";
for (int i = 0;i < 17;i++)
cout << A[i];
cout << y << endl;
}
return 0;
}
运行测试结果: