1031 查验身份证

 注意点:

一,加权求和表示,每一位乘以该位的权值最后求和,只对前17位加权求和。

新学一招,整型到字符的hash。

string hashtable = "10X98765432";

#include<iostream>
#include<cctype>
using namespace std;

string hashtable = "10X98765432";
int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main() {
    int n,cnt = 0;
    cin>>n;
    string str;
    for(int i = 0; i < n; ++i) {
        cin>>str;
        bool flag = true;
        int sum = 0;
        for(int i = 0; i < str.size()-1; ++i)//检查前17位是否全是数字
            if(!isdigit(str[i])) {
                flag = false;
                break;
            } else sum += (str[i]-'0')*weight[i];
        if(flag == false || hashtable[sum%11] != str[17])//前17位存在非数字或者最后一个检验位不正确
            cout<<str<<endl;
        else cnt++;//有效数据加一 
    }
    if(cnt == n) cout<<"All passed";
    return 0;
}

 

posted @ 2020-02-18 16:28  tangq123  阅读(187)  评论(0编辑  收藏  举报