日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

18位身份证号码校验

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 18位身份证号码校验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述

現(xiàn)在我國公民使用的18位身份證號碼,由前 17位信息碼和最后1位校驗碼組成。前17位信息碼,有各自的含義:6位地址碼,8位出生日期碼,3位順序碼。

  • 前6位的地址碼,是按照GB/T2260的規(guī)定,給常住戶口所在縣(市、旗、區(qū))的行政區(qū)域分配的代碼。
  • 8位出生日期碼代表出生日期,分別是XXXX年XX月XX日。
  • 3位順序碼表示在同一地區(qū),給同年同月同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。

最后1位校驗碼由前17位信息碼通過校驗規(guī)則計算得出:

分析

圖中沿著紅色箭頭運算方向,需要記下各位對應(yīng)的權(quán)值;而沿著綠色箭頭運算方向,僅需左移運算符。為了使代碼簡潔,我們不去將各位對應(yīng)的權(quán)值寫到代碼中,而采用位運算的方法。并且算法中可以將最后一位也統(tǒng)一到前17位的運算中,避免了將“校驗碼對照表”寫進(jìn)代碼中。

實現(xiàn)

以下是基于C++11的身份證號碼校驗的實現(xiàn):

#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; }

總結(jié)

以上是生活随笔為你收集整理的18位身份证号码校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。