7-4 身份證號碼最後一位 (100分)

滄橙-BUPT發表於2020-12-20

7-4 身份證號碼最後一位 (100分)

身份證編碼規則如下:根據〖中華人民共和國國家標準GB11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。

順序碼(身份證第十五位到十七位)是縣級公安機關所轄派出所的分配碼,每個派出所分配碼為10個連續號碼,例如“000-009”或“060-069”,其中單數為男性分配碼,雙數為女性分配碼,如遇同年同月同日有兩人以上時順延第二、第三、第四、第五個分配碼。如:005的就是個男性,而且和他同年月日生的男性至少有兩個,他們的後四位是001和003。分配順序碼中“999、998、997、996”四個順序號分別為男女性百歲以上老人專用的特定編號。 校驗碼(身份證最後一位)是根據前面十七位數字碼,按照ISO7064:1983.MOD11-2校驗碼計算出來的檢驗碼。

從1999年10月1日起,全國實行公民身份證號碼制度,居民身份證編號由原15位升至18位。前6位為地址碼;第七位至14位為出生日期碼,此碼由6位數改為8位數,其中年份用4位數表示;第15位至17位為順序碼,取消了順序碼中對百歲老人使用的特定編號;第十八位為校驗碼,主要是為了校驗計算機輸入公民身份證號碼的前17位數字是否正確,其取值範圍是0至10,當值等於10時,用羅馬數字符X表示。

計算方法

1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、將這17位數字和係數相乘的結果相加。

3、用加出來和除以11,看餘數是多少?

4、餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最後一位身份證的號碼為1-0-X -9-8-7-6-5-4-3-2。(即餘數0對應1,餘數1對應0,餘數2對應X…)

5、通過上面得知如果餘數是3,就會在身份證的第18位數字上出現的是9。如果對應的數字是2,身份證的最後一位號碼就是羅馬數字X。

例如:某男性的身份證號碼為【53010219200508011X】, 我們看看這個身份證是不是符合計算規則的身份證。

首先我們得出前17位的乘積和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然後用189除以11得出的結果是189÷11=17餘下2,187÷11=17,還剩下2不能被除盡,也就是說其餘數是2。最後通過對應規則就可以知道餘數2對應的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。

現在請你寫一段程式來判斷一個身份證號碼的最後一位是否與上述規則相符。

輸入格式:
第一行一個整數T(0<T<100),表示有T行測試資料。後邊是T行每行是一個18位的身份證號碼(測試資料前17位保證符合身份證號碼的要求)。

輸出格式:
T行,與輸入的T行測試資料相對應,如果該行測試資料最後一位符合所述演算法則輸出right,否則輸出wrong。

輸入樣例:

2
34052419800101001X
310105199412049278

輸出樣例:

right
wrong
#include<stdio.h>

int main() {
    int n,c;
    scanf("%d",&n);
    char a[20];
    for (int i = 1; i <= n; i++) {
       scanf("%s",a);
        c=7*(a[0]-'0')+9*(a[1]-'0')+10*(a[2]-'0')+5*(a[3]-'0')+8*(a[4]-'0')+4*(a[5]-'0')+2*(a[6]-'0')+(a[7]-'0')+6*(a[8]-'0')+3*(a[9]-'0')+7*(a[10]-'0')+9*(a[11]-'0')+10*(a[12]-'0')+5*(a[13]-'0')+8*(a[14]-'0')+4*(a[15]-'0')+2*(a[16]-'0');
        c=c%11;
        if (c==0&&a[17]=='1'){
            printf("right\n");
        }else  if (c==1&&a[17]=='0'){
            printf("right\n");
        } else  if (c==2&&a[17]=='X'){
            printf("right\n");
        }else  if (c==3&&a[17]=='9'){
            printf("right\n");
        }else  if (c==4&&a[17]=='8'){
            printf("right\n");
        }else  if (c==5&&a[17]=='7'){
            printf("right\n");
        }else  if (c==6&&a[17]=='6'){
            printf("right\n");
        }else  if (c==7&&a[17]=='5'){
            printf("right\n");
        }else  if (c==8&&a[17]=='4'){
            printf("right\n");
        }else  if (c==9&&a[17]=='3'){
            printf("right\n");
        }else  if (c==10&&a[17]=='2'){
            printf("right\n");
        }else{
            printf("wrong\n");
        }
    }
    return 0;
}

相關文章