身份证校验位并非简单加权求和取模
#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位。
- 校验码计算较复杂,可通过在线工具验证。

