![](https://img-blog.csdnimg.cn/img_convert/16c3b623d23a4d06d244830fd0a7d2fa.png)
问题分析:
1.本题使用char类型存储身份证号可以便于验证是否所有位数全为数字
2.字符数组char a[m] 可以利用scanf("%s",a)输入,利用printf("%s",a)输出
#include <cstdio>
#define MAXN 101
using namespace std;
int w[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'};
//z为下标,m[z]即为相应的校验码,注意数字要加单引号,因为是字符
int main()
{
int n,flag1 = 1;//flag1标记是否所有号码都正常
char Id_Card[MAXN][19];//身份证号码
scanf("%d",&n);
for(int i = 0; i < n; i++){
getchar();//吸收换行
scanf("%s",Id_Card[i]);//输入身份证号
}
for(int i = 0; i < n; i++){
int flag2 = 1;//标记前17位是否全为数字
for(int j = 0; j < 17; j++){//检查前17位是否全为数字
if(!(Id_Card[i][j] >= '0'&&Id_Card[i][j] <= '9')){
flag1 = 0;//不会是所有的号码都正常了
flag2 = 0;//出现不为数字的
printf("%s\n",Id_Card[i]);//输出不合理身份证号
break;//直接退出检查
}
}
if(flag2){//满足前17位全为数字,检测第18位是否正确
int w_sum = 0;//加权和
for(int j = 0; j < 17; j++){
w_sum += (Id_Card[i][j] - '0') * w[j];
}
w_sum %= 11;//对11取模
if(m[w_sum] != Id_Card[i][17]){
flag1 = 0;//不会是所有的号码都正常了
printf("%s\n",Id_Card[i]);//输出不合理身份证号
}
}
}
if(flag1){//所有号码都正常
printf("All passed\n");
}
return 0;
}