仅仅做出来了一道题,
题目一:查找符合规范的身份证号的数量有多少。
给出了身份证号的校验算法,我从网上搜到了效验规则,如下图
题目是身份证号第15-17位可能看不清了,可能一位看不清,也可能两位三位。问:符合校验规则的身份证号有多少种可能。
另外问一下有人知道网易互娱多少分能合格吗?
mark一下自己的代码,虽然感觉写的一般。
#include <iostream> #include <unordered_map> #include <vector> using namespace std; unordered_map<char, int> cimp = { {'1', 0}, {'0', 1}, {'X', 2}, {'9', 3}, {'8', 4}, {'7', 5}, {'6', 6}, {'5', 7}, {'4', 8}, {'3', 9}, {'2', 10} }; int findnum (int& sum_, int& modNum_, vector<int>& param_) { int ans = 0; int n = param_.size(); int maxNum = 0; if (n == 1) maxNum = 9; else if (n == 2) maxNum = 99; else if (n == 3) maxNum = 999; else return 0; int sumBak = sum_; for (int i = 0; i <= maxNum; ++i) { int k = i; int sumBak = sum_; for (int j = n - 1; j >= 0; --j) { sumBak += param_[j] * (k % 10); k /= 10; } if ((sumBak % 11) == modNum_) ans++; } return ans; } int main() { int n; array<int, 17> param = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; cin >> n; if (n == 0) return 0; vector<string> input; for (int i = 0; i < n; ++i) { string id; cin >> id; input.push_back(id); } int sum = 0; int modNum = 0; vector<int> paramVec; for (int i = 0; i < n; ++i) { string in = input[i]; sum = 0; paramVec.clear(); for (int j = 0; j < 17; ++j) { if (isdigit(in[j])) { int temp = param[j] * (in[j] - '0'); sum += temp; } else { paramVec.push_back(param[j]); } } char c = in[17]; modNum = cimp[c]; int ans = 0; ans = findnum (sum, modNum, paramVec); cout << ans << endl; } return 0; }
全部评论
(2) 回帖