#include<stdio.h>
int main(){
int q[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; /*身份证号码前17位加权系数*/
int i,j; /*循环指示标*/
char idm[12]="10X98765432"; /*z的转换*/
int n,sum[101]={0},t[101]={0}; /*n为身份证个数,sum用来存储各个身份证的加权平均数并初始化为全部为零,t用来标记身份证是否为真,初始化为全部为零*/
char str[101][19]; /*身份证号字符数组*/
//定义变量
scanf("%d",&n); /*输入身份证号个数*/
for(i=0;i<n;i++){
scanf("%s",str[i]);
} /*输入各个身份证号,可以注意到,此处使用了数组行地址*/
for(i=0;i<n;i++)
{
int flag=0; /*定义统计各个字符数组前十七位中数字的个数的变量*/
for(j=0;j<17;j++)
{
if(str[i][j]>='0'&&str[i][j]<='9')
flag++; /*统计各个字符数组前十七位中数字的个数*/
}
if(flag==17) /*若身份证号码前17位都是数字*/
{
for(j=0;j<17;j++)
{
sum[i]+=(str[i][j]-48)*q[j];
}
sum[i]%=11; /*则进行加权平均并对11展开求余运算*/
if(str[i][17]!=idm[sum[i]])
{
t[i]=1;
} /*idm[sum[i]]即是由z转来的m,将其与身份证最后一位比较,判断身份证真伪*/
}
else
{
t[i]=1; /*若身份证号码前17位不全是数字,则进行标记*/
}
}
//判断各个身份证真伪
int count=1,flag1=1; /*补充定义变量:count判断输入数据中是否有出错号码,flag1标识该数组是否为第一行*/
for(i=0;i<n;i++)
{
if(t[i]){
if(flag1){
printf("%s",str[i]);
flag1=0;
} /*输出错误的字符串中第一行*/
else
{
printf("\n%s",str[i]);
} /*换行输出错误字符串中的其他行*/
count=0; /*若输入中没有出错号码,则count=0*/
}
}
if(n){
if(count){
printf("All passed\n");
} /*若输入号码个数不为零且其中没有出错号码,则输出all passed*/
}
return 0;
}