首页 » 技术分享 » 18位身份证号编码规则&最后一位

18位身份证号编码规则&最后一位

 

例如某18位身份证号为:ABCDEF YYYY MMDD SSSV

第1位——第6位代表(ABCDEF):表示区域。

第7位——第14位(YYYYMMDD):表示出身日期,例如20140809。

第15位——第17位(SSS):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

第18位(V):校验码,根据前17位数字和计算公式得出,计算公式是:x=Sum(Ai*217-i+1mod 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位身份证号编码规则&最后一位,转载请注明来源!

3