1021. 查驗身份證

題目描述

一個合法的身份證號碼由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”。

 

輸入例子:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

 

輸出例子:

12010X198901011234
110108196711301866
37070419881216001X

 

代碼:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int n;
    int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char des[11]={'1','0','X','9','8','7','6','5','4','3','2'};
    cin>>n;
    string str;
    int count=0;
    while(n--)
    {
        cin>>str;
        int sum=0;
        for(int i=0;i<17;i++)
        {
            if(str[i]<='9' && str[i]>='0')
            {
                sum+=weight[i]*(str[i]-'0');
            }
            else
            {
                cout<<str<<endl;
                count++;
                break;
            }
        }
        char check=des[sum%11];
        if(check!=str[17])
        {
            cout<<str<<endl;
            count++;
        }
    }
    if(count==0)
    {
        cout<<"All passed";
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章