1031. 查驗身份證(15)
阿新 • • 發佈:2018-03-03
ret 分配 身份證號碼 bsp 順序 scan OS 輸入格式 輸出格式
一個合法的身份證號碼由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
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 5 int quan( char a[])6 { 7 int sum=0; 8 char temp; 9 int i; 10 int weight[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //權值 11 for( i=0; i<17; i++) 12 { 13 temp=a[i]; 14 if( temp>=‘0‘&& temp<=‘9‘) 15 { 16 temp = temp -‘0‘; 17 sum += temp*weight[i];18 } 19 else return 11;//返回第十二位 20 } 21 return sum%11; 22 } 23 int main() 24 { 25 int n,z; 26 char m[]= {‘1‘,‘0‘,‘X‘,‘9‘,‘8‘,‘7‘,‘6‘,‘5‘,‘4‘,‘3‘,‘2‘,‘A‘}; //添加第十二位表示錯誤 27 int i; 28 int flag=1; 29 scanf("%d",&n); 30 for( i=0; i<n; i++) 31 { 32 char a[18]; //每次重新定義 33 scanf("%s",a); 34 z = quan(a); 35 if( m[z]!= a[17]) 36 { 37 puts(a); 38 flag =0; 39 } 40 } 41 if( flag ) //如果flag==1 42 printf("All passed"); 43 return 0; 44 }
1031. 查驗身份證(15)