題目:
一個合法的身份證號碼由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的感覺最爽了。。。)