7-4 身份證號碼最後一位 (100分)
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;
}
相關文章
- 身份證最後一位的校驗
- PHP 驗證身份證號碼PHP
- PHP獲取IMEI號最後一位校驗碼PHP
- javascript身份證號碼校驗JavaScript
- excel身份證號提取年齡公式 身份證號碼提取精確年齡的公式Excel公式
- 匹配身份證號碼正規表示式
- C++身份證號驗證C++
- js正則驗證身份證號JS
- 中國身份證號驗證庫
- iOS身份證號識別iOS
- swift 郵箱、密碼、手機號、身份證驗證正則Swift密碼
- 提供一箇中國身份證號碼判斷的類
- ng 姓名,手機,身份證號碼 脫敏處理
- PostgreSQL版的身份證號碼15位轉18位SQL
- java——15位身份證號碼升級到18位Java
- 7-4 後天 (5分)
- 編寫正則:匹配郵箱 手機號 密碼以及身份證號密碼
- 身份證號碼的正規表示式及驗證詳解(JavaScript,Regex)JavaScript
- 藍橋杯 -- 演算法提高 身份證號碼升級演算法
- excel身份證號計算年齡Excel
- C++身份核驗介面程式碼、身份證OCR、身份證實名認證APIC++API
- Javascript使用正則驗證身份證號(簡單)JavaScript
- 手機、電話號碼、郵箱、域名、身份證號的測試用例
- 驗證身份證號碼格式並且得到出生年月和性別
- js檢查身份證號是否正確JS
- JS驗證18位身份證號的正確性JS
- 通過身份證號碼獲取人的年齡和性別
- JS校驗身份證號的合法性JS
- 增強版實名認證介面-Java身份證實名認證介面程式碼-身份認證Java
- 使用捕獲 獲取身份證號的資訊
- PHP校驗15位和18位身份證號PHP
- 正則提取車牌最後一位數字
- 身份證號碼在excel中怎麼完整顯示 excel身份證數字變成了小數點+e+17怎麼辦Excel
- java正規表示式替換手機號,身份證號處理 星號Java
- jQuery如何用正規表示式驗證手機號、身份證號、中文名稱jQuery
- Java格式化手機號和身份證號,中間使用星號*隱藏Java
- js 識別身份證號的性別、生日、年齡JS
- 用 python 製作全國身份證號驗證及查詢系統Python