中国身份证编码机制及实现

/*
* =====================================================================================
*
*       Filename:  identity.c
*
*    Description:  中华人民共和国身份证编码机制
*
*        Version:  1.0
*        Created:  2011年01月02日 14时20分38秒
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  Yang Shao Kun (), cdutyangshaokun@163.com
*        Company:  College of Information Engineering of CDUT
*
* =====================================================================================
*/

/*编码规则:公民身份号码是特征组合码,由17位数字本体码和一位校验码组成排列顺
             序从左到右依次为:六位数字地址码,八位数字出生日期码,三位数字顺
            序码和一位校验码。
例如:abcdefghijklmnopqr
其含义如下:
            1:地址码abcdef,表示编码对象常住户口所在县的行政区划代码。
                ab:所在省市        
                cd:所在地区
                ef:所在县区
            2:出生日期码:ghijklmn,表示编码对象常住户口所在县的行政区划代
            码。
                ghij:所在年
                kl:出生月
                mn:出生日
            3:顺序码:opq,表示在同一地址所标识的区域范围内,对同年同月,同
            日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
                op:户口所归属的派出所
                q:性别及顺序,男为奇数,女为偶数。表示前16位数字完全相同时,
                    某个公民的顺序号,如果前16位数字均相同的同性别的公民超过
                    5个,则可以"进位"到第16位。还特殊规定,最后3位数为996
                    997 998 999 这4个号码为百岁老人的代码,这4个号码不再分配
                    给任何派出所。
            4:校验码:r,一位数字,通过前17位数字根据一定计算得出。
            公式为:
                    s=sum(ai*wi),i=0,,,16
                    ai,表示第i 位置上的省份证号码数字值,wi 表示第i 位置上的
                    加权因子,其各位对应的值依次为:7 9 10 5 8 4 2 1 6 3 7 9
                    10 5 8 4 2.
            通俗解释为:用s 除以 11 ,看最后的余数,如果出尽,为0 余数为1,
                        则计为 1,最大余数为10,全部数字为:0~10共11个数字
                        用Y表示。
            对应关系为:
                    Y的值:0 1 2 3 4 5 6 7 8 9 10
                   校验码:1 0 X 9 8 7 6 5 4 3 2
                  如果校验码不符合这个规则,则肯定是假号码。
     */
/*编写一个省份证码的验证程序*/
#include
#include
#include
int main(int argc,char **argv)
{

    int wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char identity[18];/*用来存放证件号码*/
    int  s=0;
    int i,j;
loop:    printf("please enter you identity num: ");
    scanf("%s",identity);
    printf("/n");
    char bi[17];
    int ai[17];
    memset(bi,0,17);
    memset(ai,0,17);
    for(i=0;i<17;i++)
        bi[i]=identity[i];
    for(i=0;i<17;i++)
    {
        if(bi[i]=='0') ai[i]=0;
        else if(bi[i]=='1') ai[i]=1;
        else if(bi[i]=='2') ai[i]=2;
        else if(bi[i]=='3') ai[i]=3;
        else if(bi[i]=='4') ai[i]=4;
        else if(bi[i]=='5') ai[i]=5;
        else if(bi[i]=='6') ai[i]=6;
        else if(bi[i]=='7') ai[i]=7;
        else if(bi[i]=='8') ai[i]=8;
        else if(bi[i]=='9') ai[i]=9;
    }
    for (i=0;i<17;i++)
    {
        s+=ai[i]*wi[i];
    }
    int y;
    char check=' ';/*校验码位数值*/
    y=s%11;
    if(y==0) check='1';
    else if(y==1) check='0';
    else if(y==2) check='X';
    else if(y==3) check='9';
    else if(y==4) check='8';
    else if(y==5) check='7';
    else if(y==6) check='6';
    else if(y==7) check='5';
    else if(y==8) check='4';
    else if(y==9) check='3';
    else if(y==10) check='2';

    if(identity[17]!=check)
    {
        printf("错误的身份证号码,请输入正确的身份证件号码!!!/n");
        goto loop;
    }
    else if(identity[17]==check)
    {
        printf("合法的身份证号码!!!/n");
        printf("你的生日是:");
        for(i=0;i<17;i++)
        {
            if(i==6)
            {
                for(j=0;j<8;j++)
                    printf("%d",ai[i+j]);
            }
        }
        printf("和你同年同月同日生的人的个数有:");
        if(ai[16]%2)
        {
            printf("you are a man!!!");
            j=ai[16];
            for(i=0;i<6,j>0;i++)
            {
                j-=2;
            }
            printf("和你同年同月同日生的人的个数至少有:%d",i);
        }
        else if(!ai[16]%2)
        {
            printf("you are a girl!!!");
            j=ai[16];
            for(i=0;i<6,j>=0;i++)
            {
                j-=2;
            }
            printf("和你同年同月同日生的人的个数至少有:%d",i);
        }

    }
    return 1;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值