思路
每输入一个身份证进行一个核验:a、前17位是否存在非数字,不存在则进行加权求和
b、如果前17位全是数字,核验最后一位是否正确
#include <stdio.h>
int main()
{
int n, i, j, z, count1, count=0, pow[20]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char a[20], m[15]="10X98765432"; //字符数组的赋值
scanf("%d", &n);
//以下for循环对每个输入的身份证进行核验
for (i=0; i<n; i++) {
scanf("%s", a); //a数组用来接收输入的身份证号码,用字符串形式输入更不容易出错,%c输入还要考虑换行
count1=0; //count1用来记录前17位是否全为数字,每次循环要归零
z=0; //每次循环z也要归零,这里遗漏了
for (j=0; j<17; j++) {
if (a[j]<'0' || a[j]>'9') { //判断是否存在非数字字符
printf("%s\n", a);
count++;
count1++;
break;
}
else z+=(a[j]-'0')*pow[j]; //此处不能写为a[j]*pow[j],即将字符型数字转化为整型数字要减'0'
//printf("%d\n", z); //测试代码
}
if (m[z%11]!=a[17] && count1==0) { //判断最后一位是否匹配
count++;
printf("%s\n", a);
}
}
//判断完所有身份证后,看是否全对
if (count==0) printf("All passed");
}
1、m[15]="10X98765432"; //字符数组的一种赋值方式。
2、z=0; //每次循环z也要归零,这里遗漏了。
3、if (a[j]<'0' || a[j]>'9') //判断是否存在非数字字符。
4、z+=(a[j]-'0')*pow[j]; //此处不能写为a[j]*pow[j],即将字符型数字转化为整型数字要减'0',否则'2'*2=100。
5、if (m[z%11]!=a[17] && count1==0) //判断最后一位是否匹配,比较两个字符是否相等。