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




#网易互娱笔试##网易互娱##笔试题目#
全部评论
谢谢楼主,学习一下。
点赞
送花
回复 分享
发布于 2021-08-07 22:33
楼主已经很厉害,加油
点赞
送花
回复 分享
发布于 2021-08-10 17:11
神州信息
校招火热招聘中
官网直投

相关推荐

1 11 评论
分享
牛客网
牛客企业服务