题目:
题目试了很多种方法,改了很多次才完成
总结一下思路:
首先需要接收输入的身份证号码
再检验前17位是不是数字
然后求加权和对11取模的数是否与校验码一致
最后将有问题的号码全部输出
里面还有许多小细节需要注意一下,我都有在代码里加以标注,代码如下:
#include<stdio.h>
int main()
{
char s[100][20];//前面存放第几个输入的号码,后面存放号码
int a[18]={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'};//校验码
int n,num=0,i,j,b;
scanf("%d",&n);
getchar();//下面将收取字符,故要把回车去掉
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
}
for(i=0;i<n;i++)//从输入的第一个身份证开始
{
for(j=0;j<17;j++)//判断前17位是否为数字
if(s[i][j]-'0'<0||s[i][j]-'0'>9)//s需要强制转化一下类型
break;//不是直接跳出
if(j==17)//前17个都是数字
{
int sum=0;
for(j=0;j<17;j++)
sum+=(s[i][j]-'0')*a[j];
b=sum%11;
if(m[b]!=s[i][17])//判断最后一位
puts(s[i]);
else num++;
}
else puts(s[i]);
}
if(num==n) printf("All passed\n");//当没输出的身份证个数与输入的一样时,则全部正确
return 0;
}
希望对大家有所帮助!