/*
身份证校验算法:
根据各位的权重,求得校验和
对校验和取余(11),求得校验序号
根据校验序号,找到对应的校验码
身份证号最后一位为校验码
*/
#include <stdio.h>
int g_IDCard[18]={0};
int g_Factor[17]={7, 9, 10, 5, 8,4, 2, 1, 6, 3,7, 9, 10, 5, 8,4, 2}; //身份证号从左到右各位的权重
char Validate[11]={'1', '0', 'X', '9', '8','7', '6', '5', '4', '3','2'}; //身份证号最后一位的校验码
int CaluIDCheckNumber() //根据各位权重,求得验证和
{
int nRet = 0;
for(int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0])- 1; i++)
{
nRet += g_IDCard[i] * g_Factor[i];
}
return nRet % 11;
}
void ConvertStr2IDAry(char* strID) //将身份证号的字符串转换为数组并进行运算
{
for(int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0])-1; i++)
{
g_IDCard[i] = strID[i] - '0';
}
}
int IsIDNumberValidated(char* strIDNmuber) //将身份证号的验证码跟算出的验证序号比较
{
ConvertStr2IDAry(strIDNmuber);
int nValue = CaluIDCheckNumber();
if(Validate[nValue] == strIDNmuber[17])
return 1;
else
return 0;
}
int main(int argc, char* argv[])
{
char IDNumber[19] = {'0'};
gets(IDNumber);
if(IsIDNumberValidated(IDNumber))
{
printf("合格\r\n");
}
else
{
printf("失败\r\n");
}
}