中國身份證編碼機制及實現

/*
* =====================================================================================
*
*       Filename:  identity.c
*
*    Description:  中華人民共和國身份證編碼機制
*
*        Version:  1.0
*        Created:  2011年01月02日 14時20分38秒
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  Yang Shao Kun (), [email protected]
*        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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章