题目:一个合法的身份证号码由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
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
思路:计算出对应校验码,然后与对应位置的校验码对比。
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; int main() { int weight[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 }; int N = 0, index = 0, flag = 0, judge = 0; cin >> N; char M[11] = { '1','0','X' ,'9', '8', '7', '6', '5', '4', '3', '2' }; int* sum = new int[N]; vector<string> identity; for (int i = 0; i < N; i++) { string teamp; cin >> teamp; sum[i] = 0; identity.push_back(teamp); if (identity[i].size() != 18)return 0; } for (int i = 0; i < N; i++) {//外层循环切换身份 for (int j = 0; j < 17; j++) {//内层循环加权 sum[i] = sum[i] + (identity[i][j] - '0')*weight[j]; } index = sum[i] % 11;//和对十一取模,获取对应的校验码 if (M[index] !=identity[i][17] )cout << identity[i] << endl;//身份最后一位与校验码不同,输出错误身份 else flag ++; } if (flag == N)cout << "All passed"; return 0; }