码迷,mamicode.com
首页 > 其他好文 > 详细

C零基础视频-26-身份证号校验程序

时间:2019-10-17 23:53:22      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:idc   ima   val   ade   class   com   turn   lis   ==   

第二代身份证号的组成

第二代身份证号为18位,各位数字对应了不同的信息(以下顺序从左往右):
AABBCCYYYYMMDDXXXV

AA BB CC YYYY MM DD XXX V
2 2 2 4 2 2 3 1
出生年 出生月 出生日 顺序码 校验码

其中,最后一位校验数字,是通过之前的信息计算得来,拿到一个身份证号,可以通过重新计算校验数字并与最后一位做比较,判断是否身份证号不合要求。

校验算法

身份证校验算法的计算过程是:

  • 根据各位权重,求得校验和
  • 对校验和取余(11),求得校验序号
  • 根据校验序号,找到对应的校验码

各位权重

身份证号从左往右各位的权重是:
技术图片

校验码表

校验序号 0 1 2 3 4 5 6 7 8 9 10
对应符号 1 0 X 9 8 7 6 5 4 3 2

程序代码

#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 CalcIDCheckNumber()
{
    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* strIDNumber)
{
    ConvertStr2IDAry(strIDNumber);
    int nValue = CalcIDCheckNumber();
    if (Validate[nValue] == strIDNumber[17])
        return 1;
    else
        return 0;
}

int main(int argc, char* argv[])
{
    if (IsIDNumberValidated("43042120090805523X"))
    {
        printf("校验合格\r\n");
    }
    else
    {
        printf("校验失败\r\n");
    }
    
    return 0;
}

C零基础视频-26-身份证号校验程序

标签:idc   ima   val   ade   class   com   turn   lis   ==   

原文地址:https://www.cnblogs.com/shellmad/p/11695512.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!