20210807网易互娱笔试题
仅仅做出来了一道题,
题目一:查找符合规范的身份证号的数量有多少。
给出了身份证号的校验算法,我从网上搜到了效验规则,如下图
题目是身份证号第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;
}
