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