思路:用数组存储权重,Z,M。然后每次输入进行判断,先判断前17位是否是整数,只要有一项不是就退出循环,根据j值即可判断是否合理。都是整数的话,就逐项乘以对应权重。循环结束之后,对11取模,再对应到Z,再对应M,和最后一位进行比较,如果不等的话,也是不合理的。每次找出一个合理的身份,pass+1,最后pass要和n比较,如果相等,即输出“All passed”。
代码:
#include<iostream>
using namespace std;
int main(){
int n,sum = 0,pass = 0;
int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int Z[11] = {0,1,2,3,4,5,6,7,8,9,10};
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
cin >> n;
char str[110][20];
int i,j;
for(i = 0;i < n;i ++){
cin >> str[i];
int flag = 0; //标记每一个身份证是否合理
for(j = 0;j < 17;j ++){
if(str[i][j] < '0' || str[i][j] > '9') break; //存在非整数,退出循环
sum += (str[i][j]-'0') * weight[j]; //计算权重
}
if(j < 17){
flag = 0;
cout << str[i] << endl;
}
else{
sum %= 11;
if(M[sum] == str[i][17]){ //取完模,Z对应M,是否和最后一位相同
flag = 1;
pass ++; //计算总共合理的身份数量
}
else cout << str[i] << endl;
}
sum = 0; //每次循环结束要归0
}
if(pass == n){
printf("All passed\n");
}
return 0;
}
版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~