身份证校验位并非简单加权求和取模
#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. 地址码(第1-6位)​
    • 第1-2位:省级行政区代码(如北京11、上海31)。
    • 第3-4位:地级市/区代码。
    • 第5-6位:县/县级市/区代码。
    • 例如:110105表示北京市朝阳区。
  2. 出生日期码(第7-14位)​
    • 第7-10位:出生年份(4位,如1990)。
    • 第11-12位:出生月份(2位,01-12)。
    • 第13-14位:出生日期(2位,01-31)。
    • 例如:19900520表示1990年5月20日。
  3. 顺序码(第15-17位)​
    • 第15-16位:同一地址区域内同一天出生人员的顺序编号。
    • 第17位:性别标识码,奇数代表男性,偶数代表女性
    • 例如:017中的7(奇数)表示男性。
  4. 校验码(第18位)​
    • 由前17位通过特定算法(ISO 7064标准)计算得出,范围是0-9XX代表数字10)。
    • 用于验证身份证号码的合法性。

示例解析

以身份证号 110105199005200717X 为例:

  • 110105:北京市朝阳区
  • 19900520:1990年5月20日出生
  • 071:顺序码,第17位1(奇数)表示男性
  • X:校验码

注意事项

  • 旧版身份证为15位(出生年份仅2位,无校验码),新版扩充为18位。
  • 校验码计算较复杂,可通过在线工具验证。
226 日 , 2025 22:43
太好了又可以看BiliBili了~
217 日 , 2025 0:15

109 日 , 2025 16:49