题目:
我国现行的二代身份证号码是18位数字,由前17位数字本体码和最后1位校验码组成.校验码通过前17位数字根据一定规则计算得出,如果校验码不符合这个规则,那么该号码肯定是假号码.
计算方法为:前17位分别乘权重后相加,权重表如下图
乘积和除以11得到余数,再将余数从0-10转换为
{‘1’,‘0’,‘X’,‘9’,‘8’,‘7’,‘6’,‘5’,‘4’,‘3’,‘2’}
对比身份证最后一位是否校验正确,若正确输出出生日期,错误则输出"Fail"
思路
将身份证读到一个字符串中,再把每个char转换为int (根据ascii表-48即可)
然后将这些数据存到一个数组中与权重相乘后计算即可
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char turn[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int sfz[17];
int i;
long int total=0;
char input[18];
int yushu;
char birthday[16];
scanf("%s",input);
for(i=0;i<=16;i++)
{
sfz[i]=(int)(input[i]-48);
}
for(i=0;i<=16;i++)
{
total=total+(sfz[i]*wi[i]);
}
yushu=total%11;
if(turn[yushu]==input[17])
{
sprintf(birthday,"%d%d%d%d%s%d%d%s%d%d",sfz[6],sfz[7],sfz[8],sfz[9],".",sfz[10],sfz[11],".",sfz[12],sfz[13]);
printf("%s\n",birthday);
printf("真身份证\n4");
}
else
{
printf("Fail\n");
}
return 0;
}
运行结果如下: