18位身份证号码校验
生活随笔
收集整理的這篇文章主要介紹了
18位身份证号码校验
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
現在我國公民使用的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位身份证号码校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论实力和智慧,美的微晶冰箱有点东西!
- 下一篇: vue双向绑定经典案例