身份证校验算法(C语言)

/*
身份证校验算法:
根据各位的权重,求得校验和
对校验和取余(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");
    }
}