題目描述:node
一個合法的身份證號碼由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
本人AC代碼:spa
// PAT_1031_Check_ID // 檢驗身份證號碼是否合理 # include <stdio.h> # include <stdlib.h> # include <string.h> typedef struct { char ID[18]; // 18位身份證號碼 }Node, * NODE; int main(void) { NODE node; int Weigh[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 注意,此處輸入字符類型不用加‘’ char M[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; int n; // 記錄輸入數據的個數 int i, j; int len = 1; int *Sum, *flag; // 分別用來計算結果和判斷是否合法的標誌 scanf("%d",&n); // 動態分配內存 node = (NODE)malloc(sizeof(Node)*n); Sum = (int *)malloc(sizeof(int)*n); flag = (int *)malloc(sizeof(int)*n); // 輸入信息 for (i=0; i<n; i++) { scanf("%s",node[i].ID); // 輸入ID Sum[i] = 0; flag[i] = 0; } // 計算是否合法 for (i=0; i<n; i++) { for (j=0; j<17; j++) { // 判斷前17位是否全是數字 if (node[i].ID[j]>='0' && node[i].ID[j]<='9') { flag[i] = 1; } else { // 若是不符合,即刻 退出這次循環 flag[i] = -1; break; } } // 若是發現不符合輸入規定的,置len 標誌位爲-1 if (flag[i] == -1) len = 0; } // 計算加權之和 for (i=0; i<n; i++) { // 針對輸入合法的ID進行校驗 if (flag[i] != -1) { for (j=0; j<17; j++) { Sum[i] += (node[i].ID[j]-'0')*Weigh[j]; } } // 比對校驗位 if (M[Sum[i]%11] == node[i].ID[17]) { flag[i] = 1; } else { flag[i] = -1; len = 0; } } // 輸出信息 if (len == 1) printf("All passed\n"); else { for (i=0; i<n; i++) { if (flag[i] != 1) { for (j=0; j<18; j++) { printf("%c",node[i].ID[j]); } printf("\n"); } } } return 0; }
RRRblog