演算法學習之路|檢驗身份證

kissjz發表於2018-02-26

一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下:

首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然後將計算的和對11取模得到值Z;最後按照以下關係對應Z值與校驗碼M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

現在給定一些身份證號碼,請你驗證校驗碼的有效性,並輸出有問題的號碼。

輸入格式

輸入第一行給出正整數N(<= 100)是輸入的身份證號碼的個數。隨後N行,每行給出1個18位身份證號碼。

輸出格式

按照輸入的順序每行輸出1個有問題的身份證號碼。這裡並不檢驗前17位是否合理,只檢查前17位是否全為數字且最後1位校驗碼計算準確。如果所有號碼都正常,則輸出“All passed”。

輸入樣例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
輸出樣例1:
12010X198901011234
110108196711301866
37070419881216001X
輸入樣例2:
2
320124198808240056
110108196711301862
輸出樣例2:
All passed
解題思路

寫一個函式根據題意判斷此身份證可否通過,並將不可以通過的存入向量。

如果向量大小為0,說明全部通過,否則,依次輸出有問題的。

注意:

這裡的權重是單位1的意思,舉個例子:原本的2,權重為3時,總值為2個3,即2*3==6。

#include<iostream>
#include<vector>
using namespace std;
int quan[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char m[11]={`1` ,`0` ,`X` ,`9` ,`8` ,`7` ,`6` ,`5` ,`4` ,`3` ,`2`};
bool charm(string a,char z){
    
    int sum=0;
    for(int i=0;i<17;i++){
        if(a[i]>=`0`&&a[i]<=`9`){
            sum+=(a[i]-`0`)*quan[i];
        }
        else
            return 0;
    }
    sum=sum%11;
    
    if(m[sum]==z)
        return 1;
    else
        return 0;
}
int main(){

    vector<string>v;
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        string tmp;
        cin>>tmp;
        if(charm(tmp, tmp[tmp.size()-1])==0)
            v.push_back(tmp);
    }
    if(v.size()==0)
        cout<<"All passed";
    else{
        for(int i=0;i<v.size();i++)
            cout<<v[i]<<endl;
    }
}


相關文章