一、18位身份证号码结构
身份证号码由前十七位本体码和最后一位校验码组成
排列次序一次依次是:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码
二、校验值计算
1.本体码加权求和
公式为:S = SUM(Ai*Bi);
-Ai为身份证上第i个数字
-Bi为第i个加权因子(加权因子:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2)
2.计算模
mode = S % 11;
3.查找相应校验码
校验码:1 0 X 9 8 7 6 5 4 3 2 (第mode个)
三、C语言实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include <stdio.h>
int main(int argc, char const *argv[]) {
char getValidateCode(char *idcard);
int getValidateResult(char * idcard,char validateCode);
char * idcard="122222190904057081";
char code = getValidateCode(idcard); int result = getValidateResult(idcard,code);
printf("validatecode is %c\n",code);
if(result==1){ printf("身份证号码正确\n"); } else { printf("身份证号码不正确\n"); }
return 0; }
char getValidateCode(char *idcard){
int weight[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 i,sum=0,mode;
for(i=0;i<17;i++){ sum = sum + (idcard[i] - '0') * weight[i]; }
mode = sum%11;
return validate[mode]; }
int getValidateResult(char * idcard,char validateCode){ int result = 0; if(idcard[17]==validateCode){ result = 1; } return result; }
|