身份证号码编码规则

18 位⾝份证号码编码规则:根据〖中华⼈民共和国国家标准 GB 11643-1999〗中有关公民⾝份号码的规定,公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。可以⽤字母表⽰如为 ABCDEFYYYYMMDDXXXR。其含义如下:
1. 地址码(ABCDEF):表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码,按 GB/T2260 的规定执⾏。
2. 出⽣⽇期码(YYYYMMDD):表⽰编码对象出⽣的年、⽉、⽇,按 GB/T7408 的规定执⾏,年、⽉、⽇分别⽤ 4 位、2 位(不⾜两位加 0)、
2(同上)位数字表⽰,之间不⽤分隔符。
3. 顺序码(XXX):表⽰在同⼀地址码所标识的区域范围内,对同年、同⽉、同⽇出⽣的⼈编定的顺序号,顺序码的奇数分配给男性,偶数分配给⼥性。
4.校验码(R):⼀位数字,通过前 17 位数字按照 ISO 7064:1983.MOD 11-2 校验码计算得出。
15 位的⾝份证编码⾸先把出⽣年扩展为 4 位,简单的就是增加⼀个 19,但是这对于 1900 年出⽣的⼈不使⽤(这样的寿星不多了)
关于地址码含义的详细解释:⾝份证前六位是地区代码,我们⽤ ABCDEF 表⽰。代码的解释规则如下:
A:国内区域
1 华北三省⼆市
2 东北三省
3 华东六省⼀市
4 华南六省
5 西南四省⼀市
6 西北五省
7 台湾
8 港澳
B(或者说是 AB,就是前 2 位):省(直辖市,⾃治区,特别⾏政区)代码
按照 A 划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。
具体省(直辖市,⾃治区,特别⾏政区)代码如下:
11-15 京、津、冀、晋、蒙
21-23 辽、吉、⿊
31-37 沪、苏、浙、皖、闽、赣、鲁
41-46 豫、鄂、湘、粤、桂、琼
50-54 渝、川、贵、云、藏
61-65 陕、⽢、青、宁、新
81-82 港、澳
⽣⽇期码(YYYYMMDD)表⽰编码对象出⽣的年、⽉、⽇,其中年份⽤四位数字表⽰,年、⽉、⽇之间不⽤分隔符。例如:1981 年 5 ⽉ 11 ⽇就⽤19810511 表⽰。
顺序码(XXX)(⾝份证第⼗五位到⼗七位)是县、区级政府所辖派出所的分配码,每个派出所分配码为 10 个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为⼥性分配码,如遇同年同⽉同⽇有两⼈以上时顺延第⼆、第三、第四、第五个分配码。如:007 的就是个男⽣,⽽且和他同年⽉⽇⽣的男⽣⾄少有两个,他们的后四位是 001* 和 003*。分配顺序码中“999、998、997、996”四个顺序号分别为男⼥性百岁以上⽼⼈专⽤的特定编号。
关于校验码
18 位⾝份证最末位是校验码,是按⼀定的规则产⽣的,⽤于校验⾝份证真伪,按理这规则属于保密的,X 代表的是其中⼀个校验码,是 10。校验码从 0 到 X 共 11 个。
校验码是通过⼀系列数学计算得出来的,具体校验的计算⽅式如下:
公式为:∑(A i×W i)(mod 11)
i——表⽰号码字符从右⾄左包括校验码在内的位置序号;
A i——表⽰第 i 位置上的号码字符值;
W i——⽰第 i 位置上的加权因⼦(其值已定),其数值依据公式 W i=2^(i-1)(mod 11) 计算得出。其各位对应的值依次为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
例如:某男性公民⾝份号码为 34052419800101001V(V为校验码),对前 17 位数字本体码⾸先按照上⾯公式加权求和计算:
i:181716151413121110987654321
A i:34052419800101001V
W i:79105842163791058421
∑(A i×W i) =( 21 + 36 + 0 + 25 + 16 + 16 + 2 + 9 + 48 + 0 + 0 + 9 + 0 + 5 + 0 + 0 + 2 ) = 189
∑(A i×W i)(mod 11) = 189 mod 11 = 2
然后根据计算的结果,从下⾯的表中查出相应的校验码。其中 X 表⽰计算结果为 10。
∑(A i×W i)(mod 11):012345678910
校验码字符值 V:10X98765432
根据上表,查出计算结果为 2 的校验码为 X,所以该⼈员的公民⾝份号码应该为 340524************。
如果校验码不符合这个规则,则肯定是假号码。
关于 18 位⾝份证号码尾数是“X”的⼀种解释:因为按照上⾯的规则,校验码有 11 个,⽽不是 10 个,所以不能⽤ 0-9 表⽰。所以如果尾号是 10,那么就得⽤ X 来代替,因为如果⽤ 10 做尾号,那么此⼈的⾝份证就变成了 19 位,⽽ 19 位的号码违反了国家标准,并且我国的计算机应⽤系统也不承认19 位的⾝份证号码。Ⅹ是罗马数字的 10,⽤ X 来代替 10,可以保证公民的⾝份证符合国家标准。
//省份证号码真伪识别程序,第⼀位号码不计在内
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
char st[19];
int num[19],w[19],s=0;
freopen("","r",stdin);
freopen("","w",stdout);
cin>>st;
for(int i=1; i<=18; i++)
num[i]=st[i]-'0';
for(int i=1;i<=18;i++)
cout<<num[i];
cout<<endl;
if((num[15]*100+num[16]*10+num[17])%2==0)
cout<<"⼥性\n";
else cout<<"男性\n";
for(int i=1; i<=17; i++){
w[i]=(int)pow(2,18-i)%11;
cout<<w[i]<<"";
s+=num[i]*w[i];
}
s%=11;
if(s==0 && num[18]==1){
cout<<"\nok!\n";
return0;
}
if(s==1 && num[18]==0){
cout<<"\nok!\n";
return0;
}
if(s==2 && (st[18]=='X' || st[18]=='x')){ cout<<"\nok!\n";
return0;
}
if((s>=3 && s<=10) && (s+num[18]==12)){ cout<<"\nok!\n";
return0;
}
cout<<"\nError!\n";
return0;
}

本文发布于:2024-09-20 13:41:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/820843.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:校验码   号码   分配   规则   份证   公民   数字   直辖市
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议