思路:1 检验数字是否合法 是否17个 bool型变量
#include<cstdio>
#include<cstring>
int w[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//定义权重
char change[15]={'1','0','X','9','8','7','6','5','4','3','2'};
//数组容量定大点防止越界
int main(){
int n;
bool flag = true;
//记得赋初始值
scanf("%d",&n);
//读入输入的身份证个数 因为要多次重复读入所以用for循环
char str[20];
//存储按权重相加的结果
for(int i=0;i<n;i++){
//这个声明应该放在for循环里面 这样才能保证每次ans和j的初始化!
int ans=0,j;
scanf("%s",str);
//读入后处理,先把字符型数字转换为整形数字然后按题目要求按权重累加取余得到对应的验证码
for(j=0;j<17;j++){
//检验前17位是否都是数字
//因为在for循环里是一位一位的判断,所以当有一位不是数字时跳出
//统计最后j的数目,如果j不到16,说明其中有非数字的字符导致不满足if的条件跳出循环
if(!(str[j]>='0'&&str[j]<='9')) break;
ans = ans +(str[j]-'0')*w[j];
}
// printf("%d\n",ans%11);
//先检验再计算
if(j<17){
flag =false;
printf("%s\n",str);
}else{
// ans = ans%11;
// printf("%C\n",change[ans%11]);
if(change[ans%11]!=str[17]){
flag=false;
printf("%s\n",str);
}
}
}
if(flag) printf("All passed");
return 0;
}