L1-016. 查驗身份證

小泰格兒發表於2019-02-09

題目:

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

 

上程式碼:

  吃了昨天那個虧(畢竟用Java怎麼也不能全部AC還拿不到全分太難受了呀),今天速成了一下C++後開始接著刷題,前面幾道簡單題都很簡單,用C++都一遍通過了,所以就不做記錄了。這道題其實也沒什麼好說的,而且我這個程式碼雖然全部通過了,但也不是最優的。還是附上柳婼大大的答案吧,不過我覺得她這個答案裡面可以直接把b[11]給設為字元陣列啊,不然還要把X給換成10  (⊙▽⊙)

https://blog.csdn.net/liuchuo/article/details/51988823?utm_source=blogxgwz3

#include <cctype>
#include <iostream>
using namespace std;
bool check(char c[])
{
    int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    int sum=0;
    for(int i=0;i<17;i++)
    {
        sum+=a[i]*(c[i]-`0`);
    }
    int index=sum%11;
    char b[11]={`1`,`0`,`X`,`9`,`8`,`7`,`6`,`5`,`4`,`3`,`2`};
    return b[index]==c[17];
}
int main()
{
    int n,flag=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int a=0;
        char c[18];    
        cin>>c;
        //bool b=check(c);
        for(int j;j<17;j++)
        {
            if(isalpha(c[j]))
            {
                cout<<c<<endl;
                a=1;flag=1;
                break;
            }
        }
        if(a==0)
        {
            if(!check(c))
            {
                cout<<c<<endl;
                flag=1;
            }
        }
        
    }
    if (flag == 0) cout << "All passed";
    return 0;
}

 

我其實是為了用cctype裡面的isalpha()函式來判斷是否有字母(最開始覺得這樣方便)才硬用字元陣列接收的身份證號。其實用string s接收的話可以這麼做:if(s[i]<`0` || s[i]>`9`)

 

(全部AC的感覺最爽了。。。)

相關文章