一個(gè)合法的身份證號(hào)碼由17位地區(qū)裹纳、日期編號(hào)和順序編號(hào)加1位校驗(yàn)碼組成择葡。校驗(yàn)碼的計(jì)算規(guī)則如下:
首先對(duì)前17位數(shù)字加權(quán)求和,權(quán)重分配為:{7剃氧,9敏储,10,5朋鞍,8已添,4妥箕,2,1酝碳,6矾踱,3,7疏哗,9呛讲,10,5返奉,8贝搁,4,2}芽偏;然后將計(jì)算的和對(duì)11取模得到值Z雷逆;最后按照以下關(guān)系對(duì)應(yīng)Z值與校驗(yàn)碼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
現(xiàn)在給定一些身份證號(hào)碼,請你驗(yàn)證校驗(yàn)碼的有效性污尉,并輸出有問題的號(hào)碼膀哲。
輸入格式:
輸入第一行給出正整數(shù)N(<= 100)是輸入的身份證號(hào)碼的個(gè)數(shù)。隨后N行被碗,每行給出1個(gè)18位身份證號(hào)碼某宪。
輸出格式:
按照輸入的順序每行輸出1個(gè)有問題的身份證號(hào)碼。這里并不檢驗(yàn)前17位是否合理锐朴,只檢查前17位是否全為數(shù)字且最后1位校驗(yàn)碼計(jì)算準(zhǔn)確兴喂。如果所有號(hào)碼都正常,則輸出“All passed”焚志。
#include <iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
int weight[]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int n,z;
bool hasWrong=false,hasNoDigit; //hasWrong表示四個(gè)里是否有錯(cuò)誤衣迷,用來解決是否輸出AllPassed
char M[]={'1','0','X','9','8','7','6','5','4','3','2'};
cin>>n;
string temp[n];
for (int i=0; i<n ; i++ )
{
cin>>temp[i];
}
for (int i=0; i<n ; i++ )
{
z=0;
hasNoDigit=false;
for (int j=0; j<17; j++)
{
if(!isdigit(temp[i][j])){
hasNoDigit=true;
break;
}
z+=weight[j]*(temp[i][j]-'0');
}
z=z%11;
if(hasNoDigit||temp[i][17]!=M[z]){ //M是數(shù),temp是字符串酱酬,我曹怪不得不等壶谒。。岳悟。佃迄。。
cout<<temp[i]<<endl;
hasWrong=true;
}
}
if(!hasWrong)//不是針對(duì)每一個(gè)贵少,而是針對(duì)所有
cout<<"All passed"<<endl;
return 0;
}
注意事項(xiàng)
1.原先判斷的數(shù)組M定義成數(shù)字int類型呵俏,與char類型比較總是出錯(cuò),最好才意識(shí)到滔灶,這兩個(gè)之間的比較一定要轉(zhuǎn)換
2.后來總有一個(gè)樣例通不過普碎,百思不得其解,想著找到這個(gè)樣例录平,可是覺得應(yīng)該沒有特殊樣例沒有考慮到麻车。最終讓老孟幫我看了缀皱,是順序問題。錯(cuò)誤地把hasWrong的初始化放在了for循環(huán)之內(nèi)动猬,所以如果最后一個(gè)是正確的啤斗,那么“All Passed”都會(huì)輸出。這里是初始化的位置這里又沒考慮好