跳到主要内容

身份证号校验器

参考资料

公民身份号码 - 维基百科

说明

  1. 将身份证号码从左至右标记为 a1,a2,,a18a_1,a_2,\cdots,a_{18}a18a_{18} 即为校验码)
  2. 计算权重系数 wi=218imod11w_i=2^{18-i}\bmod 11
ii112233445566778899101011111212131314141515161617171818
wiw_i7799101055884422116633779910105588442211
  1. 计算 s=i=117aiwis=\sum_{i=1}^{17}a_i\cdot w_i
  2. a18=(12smod11)mod11a_{18}=(12-s\bmod 11)\bmod 11

代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
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;
}