#include <iostream> using namespace std; int main(){ long long id=33052200021128; //校验码对照表 const char check_code[11]={'1','0','X','9','8','7','6','5','4','3','2'}; for(int i=0;i<10;++i){ for(int j=0;j<10;++j){ for(int k=0;k<10;k+=2){ cout << id << i << j << k; int sum = 195+i*8+j*4+k*2; int remainder = sum%11; cout << check_code[remainder] << endl; } } } }
关键修正点:
校验码映射表:使用国家标准《GB 11643-1999》的校验码对照表 check_code
,余数对应关系为:
余数: 0 1 2 3 4 5 6 7 8 9 10 校验码:1 0 X 9 8 7 6 5 4 3 2
中国的18位身份证号码每一位的含义如下,按照从左到右的顺序:
- 地址码(第1-6位)
- 第1-2位:省级行政区代码(如北京11、上海31)。
- 第3-4位:地级市/区代码。
- 第5-6位:县/县级市/区代码。
- 例如:
110105
表示北京市朝阳区。- 出生日期码(第7-14位)
- 第7-10位:出生年份(4位,如
1990
)。- 第11-12位:出生月份(2位,01-12)。
- 第13-14位:出生日期(2位,01-31)。
- 例如:
19900520
表示1990年5月20日。- 顺序码(第15-17位)
- 第15-16位:同一地址区域内同一天出生人员的顺序编号。
- 第17位:性别标识码,奇数代表男性,偶数代表女性。
- 例如:
017
中的7
(奇数)表示男性。- 校验码(第18位)
- 由前17位通过特定算法(ISO 7064标准)计算得出,范围是
0-9
或X
(X
代表数字10)。- 用于验证身份证号码的合法性。
示例解析
以身份证号
110105199005200717X
为例:
110105
:北京市朝阳区19900520
:1990年5月20日出生071
:顺序码,第17位1
(奇数)表示男性X
:校验码注意事项
- 旧版身份证为15位(出生年份仅2位,无校验码),新版扩充为18位。
- 校验码计算较复杂,可通过在线工具验证。