1. 程式人生 > >1031. 查驗身份證(15)

1031. 查驗身份證(15)

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)