题目链接在此。
题意理解
题目大意很简单,注意本题需要验算的有两点:
1. 前17位是否都为数字
2. 第18位的校验码是否正确
思路
一遍读入输入的某一个身份证号,一遍验证题目需要验证的两点;也可以直接读入一个身份证号,然后遍历保存它的数组,遍历过程中实现验证过程。
AC代码
#include<stdio.h>
char mp[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
bool judge(char x){ //如果x是数字字符,返回true
return (x>='0' && x<='9');
}
int main(){
int n;
scanf("%d",&n);
bool flag; //前17位是否有非数字标志,有则=true
int sum; //记录前17位和
int count = 0; //记录不合法个数
char id[18];
int i;
for(i = 0; i < n; i++){
getchar(); //吸收换行符
flag = false;
sum = 0;
//校验前17位是否为数字
for(int j = 0; j < 18; j++){
scanf("%c",&id[j]);
if(j<17){ //前17为的加权和
sum += weight[j]*(id[j]-'0');
if(!judge(id[j])){ //之前把这个if结构卸载了j<17循环的外面,结果有个一测试点过不去,找了好久才找到!!!!
flag = true;
}
}
}
if(flag==true){ //前17位有非数字
count++;
printf("%s\n",id);
}else{ //前17位合格,比较校验位
if(mp[sum%11] != id[17]){ //校验位错误
printf("%s\n",id);
count++;
}
}
}
//所有都合法
if(count == 0){
printf("All passed\n");
}
return 0;
}
注释和踩过的坑都在代码中写好,不再赘述。