跳到主要内容
160 词数1 分钟

项目:身份证校验器

概述

中国公民身份号码校验码(第 18 位)的计算原理与实现。取前 17 位数字,按 2 的幂对 11 取模得到各位权重系数,加权求和后对 11 取模,再用 12 减去余数并对 11 取模得到校验码,结果为 10 时记作 X。附完整的权重系数表和一段 C++ 实现。

中国公民身份号码校验码计算器。

参考资料​

公民身份号码 - 维基百科

原理​

  1. 将 18 位身份证号码从左至右标记:
a1,a2,…,a18a_1,a_2,\dots,a_{18}
  1. 计算权重系数:
wi=218−i mod 11w_i=2^{18-i}\bmod 11
ii112233445566778899101011111212131314141515161617171818
wiw_i7799101055884422116633779910105588442211
  1. 计算:
s=∑i=117aiwis=\sum_{i=1}^{17}a_i w_i
  1. 校验码:
a18=(12−s mod 11) mod 11a_{18}=(12-s\bmod 11)\bmod 11

代码​

main.cpp
214 Bcpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
string s;
cin>>s;
int sum=0;
for(int i=0;i<17;i++)sum+=s[i]-'0'<<17-i;
int num=(12-sum%11)%11;
cout<<(char)(num==10?'X':'0'+num)<<'\n';
return 0;
}