请编写一个程序,通过计算校验码判断输入的身份证号码是否为一个有效身份证号码。若是有效号码则输出ok,否则输出error.
如输入:53010219200508011X
则输出:ok
若输入:110108200201010111
则输出:error
请编写一个程序,通过计算校验码判断输入的身份证号码是否为一个有效身份证号码。若是有效号码则输出ok,否则输出error.
如输入:53010219200508011X
则输出:ok
若输入:110108200201010111
则输出:error
#include <stdio.h>
#include <string.h>
char fun(int n);
int res[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main()
{
int n=1,count,both=0; // n验证次数 count 局部变量,输出错误的身份证号 both 检验是否全部正确,输出ALL passed
char result; // 最后一位校验码
//scanf("%d",&n);
//getchar();
char id[n][18];
for(int i=0;i<n;i++)
{
scanf("%s",id[i]);
}
//验证前17位数字
for(int i=0;i<n;i++)
{
count=0;
for(int a=0;a<17;a++)
{
if(id[n][a]<'0'&&id[n][a]>'9')
{
count++;
}
}
if(count>0)
{
for(int l=0;l<18;l++)
; //printf("%c",id[i][l]);
//printf("\n");
both++;
}
//进行下一步验证
if(count==0)
{
int k=0;
for(int j=0;j<17;j++)
{
k+=(id[i][j]-'0')*res[j];
}
k=k%11;
result=fun(k);
if(id[i][17]!=result)
{
for(int l=0;l<18;l++)
; //printf("%c",id[i][l]);
//printf("\n");
both++;
}
}
}
if(both==0)
{
printf("ok");
}
else
{
printf("error");
}
return 0;
}
char fun(int n) //z值与M值对应 当然也可以一维数组,不过为了更好的匹配,于是用switch语句
{
switch (n) {
case 0: return '1';
case 1: return '0';
case 2: return 'X';
case 3: return '9';
case 4: return '8';
case 5: return '7';
case 6: return '6';
case 7: return '5';
case 8: return '4';
case 9: return '3';
case 10:return '2';
}
}