身份证校验算法与C++代码优化实践

1. 身份证校验算法解析

身份证号码校验是中国公民身份证号码合法性的重要验证机制。根据国家标准GB 11643-1999,18位身份证号码的最后一位是校验码,由前17位数字通过特定算法计算得出。

校验码的计算步骤如下:

  1. 将身份证号码前17位数字分别乘以对应的权重因子。权重因子固定为:[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
  2. 将17个乘积相加得到总和S
  3. 计算S除以11的余数:S % 11
  4. 根据余数对应的校验码表确定最后一位校验码

校验码对应关系如下:
余数: 0 1 2 3 4 5 6 7 8 9 10
校验码:1 0 X 9 8 7 6 5 4 3 2

注意:校验码中的'X'是罗马数字10,必须大写。有些系统会强制转换为大写来处理输入。

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 代码实现优化方案

原始代码虽然功能完整,但存在几个可以优化的地方:

2.1 去除不必要的数组存储

原代码使用了result数组存储每个身份证的校验结果,但实际上只需要在发现错误时立即输出即可,不需要保存所有结果。这样可以节省内存空间。

优化后的处理逻辑:

cpp复制bool allPass = true;
for(int i = 0; i < N; i++) {
    if(!isValidID(mv[i])) {
        cout << mv[i] << endl;
        allPass = false;
    }
}
if(allPass) {
    cout << "All passed" << endl;
}

2.2 封装校验逻辑为函数

将身份证校验逻辑封装成独立函数,提高代码可读性和复用性:

cpp复制bool isValidID(const string& id) {
    // 检查长度是否为18
    if(id.length() != 18) return false;
    
    // 检查前17位是否为数字
    for(int i = 0; i < 17; i++) {
        if(!isdigit(id[i])) return false;
    }
    
    // 计算校验和
    int sum = 0;

内容推荐

已经到底了哦
已经到底了哦