/*
* =====================================================================================
*
* 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;
}