问题描述

现在我国公民使用的18位身份证号码,由前 17位信息码和最后1位校验码组成。前17位信息码,有各自的含义:6位地址码,8位出生日期码,3位顺序码。

  • 前6位的地址码,是按照GB/T2260的规定,给常住户口所在县(市、旗、区)的行政区域分配的代码。
  • 8位出生日期码代表出生日期,分别是XXXX年XX月XX日。
  • 3位顺序码表示在同一地区,给同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

最后1位校验码由前17位信息码通过校验规则计算得出:

分析

图中沿着红色箭头运算方向,需要记下各位对应的权值;而沿着绿色箭头运算方向,仅需左移运算符。为了使代码简洁,我们不去将各位对应的权值写到代码中,而采用位运算的方法。并且算法中可以将最后一位也统一到前17位的运算中,避免了将“校验码对照表”写进代码中。

实现

以下是基于C++11的身份证号码校验的实现:

#include <cstdint>
#include <iostream>
#include <string>
#include <vector>
#include <numeric>bool CheckId(const std::string &id)
{if (id.length() != 18) return false;std::vector<uint32_t> v;for (auto it = id.rbegin(); it != id.rend(); ++it) {if (*it >= '0' && *it <= '9') {v.push_back(*it - '0');}else if ((*it == 'x' || *it == 'X') && (it == id.rbegin())) {v.push_back(10);}else {return false;}}for (int i = 0; i < v.size(); ++i) {v[i] <<= i;}if (std::accumulate(v.begin(), v.end(), 0) % 11 == 1) {return true;}return false;
}int main(int argc, char *argv[])
{std::string id;std::cout << "Please input your ID number:" << std::endl;std::cin >> id;std::cout << (CheckId(id) ? "Right" : "Wrong") << std::endl;
}

18位身份证号码校验相关推荐

  1. 18位身份证号码最后一位校验码的计算方法

    介绍18位身份证号码最后一位校验码的计算方法 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. ...

  2. 关于18位身份证号码最后一位计算(Java实现)

    关于18位身份证号码最后一位计算(Java实现) 现代的身份证号码长度都是18位的,但是只要知道前17位便可推出第18位数字或者字母(第18位为0,1,...,9和X中的一个).也就是说,国内不存在前 ...

  3. 15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  4. 18位身份证号码规则及js验证

    2019独角兽企业重金招聘Python工程师标准>>> 一.中国居民身份证号码规则 18位身份证号码编码规则:根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份 ...

  5. MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  6. 15/18位身份证号码验证

    15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...

  7. 15位、18位身份证号码正则表达式

    身份证正则表达式 在项目中遇到身份证号码验证,百度了一些资料,太简单的和太复杂的pass,综合了一些案例,取长补短,形成了个折中版本的,正则表达式如下: var reg =/(^[1-9]\d{5}( ...

  8. Oracle 通过15位或18位身份证号码计算年龄、出生年月日、性别

    15位身份证号码各位的含义: 地址码(前六位数):表示身份证编码对象常住户口所在省份.地市,以及县(市.旗.区)的行政区划代码,1-2位数字表示所在地省.自治区.直辖市代码,第3.4位数字表示所在地地 ...

  9. python正则表达式 身份证_15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  10. 15位和18位身份证号码的结构介绍

    身份证号码编码方法 要进行身份证号码的验证,首先要了解身份证号码的编码规则.我国身份证号码多由若干位数字或者数字与字母混合组成.早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考 ...

最新文章

  1. 【转载】 Python动态生成变量
  2. 常用的分布式事务解决方案介绍有多少种?
  3. 干掉visio,这个画图神器真的绝了!!!
  4. python中对数组合并的方法
  5. java动物飞翔接力赛源程序_java-submityourcode
  6. 【已解决】Class not found: “com.bjpowernode.MyTest“
  7. 俄罗斯方块剖析之一总体计划
  8. 【转】深入理解JavaScript闭包(closure)
  9. mysql添加分区健_MySQL添加分区添加索引
  10. rsync配置和使用
  11. EL表达式和JSTL标签的区别
  12. 浅谈嵌入式软件的未来发展
  13. 配置ANDROID开发环境的方法
  14. 对于vertical-align的学习
  15. 多屏系统上播放幻灯片的设想
  16. 好用的BUS调试工具-Bus Hound
  17. python游戏对象_python基础----以面向对象的思想编写游戏技能系统
  18. CSS flex属性深入理解
  19. 使用rimraf一秒删除node_modules文件夹【亲测有用】
  20. 通过云效 CI/CD 实现微服务全链路灰度

热门文章

  1. 简单明了的网站结构设计呦!
  2. springboot项目报错-The Bean Validation API is on the classpath but no implementation could be found
  3. golang简易版聊天室
  4. 命令控制之DropBox
  5. monorepo npm publish 显示404
  6. 赛福基因公开课第二节《神经系统遗传病基因检测简介》
  7. 怎样取消QQ的热键(快捷键)
  8. 职业病 颈椎肩膀 马步、摇肩、通背劲(转载)
  9. 当前的安全设置不允许从该位置下载文件--解决方法
  10. 今年的金德值得期待的人物_原水_新浪博客