例如某18位身份证号为:ABCDEF YYYY MMDD SSSV
第1位——第6位代表(ABCDEF):表示区域。
第7位——第14位(YYYYMMDD):表示出身日期,例如20140809。
第15位——第17位(SSS):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
第18位(V):校验码,根据前17位数字和计算公式得出,计算公式是:x=Sum(Ai*217-i+1) mod 11 ,其中i=1,2,3,...,17,Ai是第i位身份证号码(从左往右数),x结果是从0到10,分别对应的V是1 0 X 9 8 7 6 5 4 3 2。
之所以mod11,而不是10是因为取模通常取素数。
自己写了个小程序用于计算最后一位校验码
Input:前17位身份证号
Output:最后一位是:X
demo:
#include<iostream>
using namespace std;
int main()
{
char card_number_17[17];
while (cin >> card_number_17 && card_number_17[17]!=EOF)
{
int sum = 0;
char last='\0';
for (int i = 17; i >= 1; i--)
{
sum += (card_number_17[17 - i] - '0')*pow(2,i);
}
switch (sum%11)
{
case 0:
last = '1';
break;
case 1:
last = '0';
break;
case 2:
last = 'X';
break;
case 3:
last = '9';
break;
case 4:
last = '8';
break;
case 5:
last = '7';
break;
case 6:
last = '6';
break;
case 7:
last = '5';
break;
case 8:
last = '4';
break;
case 9:
last = '3';
break;
case 10:
last = '2';
break;
default:
break;
}
cout <<"最后一位是:"<< last << endl;
last = '\0';
}
return 0;
}
ps:因为第15至第17位是表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。所以还要隐形的满足的条件是:同一地区同年同月同日不出生多于500个同性人(10*10*5=500)。
转载自原文链接, 如需删除请联系管理员。
原文链接:18位身份证号编码规则&最后一位,转载请注明来源!