一、问题描述
一个合法的身份证号码由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
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
二、流程设计
- 录入身份证号;
- 对每个身份证号前17位求权重后的和;
- 对和模11;
- 根据模11后的数找到正确的校验位;
- 对身份证号第18位进行校验;
- 若有误则输出;
- 若n个身份证号中无错误,则输出all passed。
三、代码实现
#include <bits/stdc++.h>
using namespace std;
int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char m[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int z[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int main() {
int n;
cin >> n;
int l = 0, temp = n;
int k;
while (n--) {
string num;
int sum = 0;
cin >> num;
for (int i = 0; i < 17; i++) {
sum += a[i] * (num[i] - 48);
}
for (int i = 0; i < 11; i++) {
if (num[17] == m[i])
k = z[i];
}
if (sum % 11 == k)
l++;
else
cout << num << endl;
}
if (l == temp)
cout << "All passed";
}
标签:11,10,17,int,校验码,num,5.14,打卡,建民 From: https://www.cnblogs.com/cor0000/p/17392023.html