身份證校驗(c++實現)


描述:

我國國標〖GB 11643-1999〗中規定:公民身份號碼是18位特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。其校驗碼(最后一位)計算方法和步驟為:
(1)十七位數字本體碼加權求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先對前17位數字的權求和
其中Ai:表示第i位置上的身份證號碼數字值
Wi:表示第i位置上的加權因子,前17位加權因子從左到右分別為
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)計算模
Y = mod(S, 11)
(3)通過模Y查下表得到對應的校驗碼
Y
0
1
2
3
4
5
6
7
8
9
10
校驗碼
1
0
X
9
8
7
6
5
4
3
2
例如:某身份證前17位為11010519491231002
i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wi
7
9
10
5
8
4
2
1
6
3
7
9
10
5
8
4
2
 
1
1
0
1
0
5
1
9
4
9
1
2
3
1
0
0
2
7
9
0
5
0
20
2
9
24
27
7
18
30
5
0
0
4
得到和為:167;則模為y=167%11=2
查(3)得校驗碼為X(大寫)
請按上面所述步驟編程,輸入一個二代身份證號,檢查該身份證是否正確。
 
輸入:輸入若干行,每行一個身份證號碼,最后一行輸入-1
輸出:輸出1代表正確,0代表錯誤
input:
120223198902021249
130132199210293822
130402198207290622
-1
output:
1
1
0
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 int cal(string a)
 6 {
 7     return (a[0] - '0') * 7 + (a[1] - '0') * 9 + (a[2] - '0') * 10 +  (a[3] - '0') * 5 + (a[4] - '0') * 8 + (a[5] - '0') *4  + (a[6] - '0') * 2 + (a[7] - '0') * 1 + (a[8] - '0') * 6 +(a[9] - '0') * 3 + (a[10] - '0') * 7 + (a[11] - '0') * 9 + (a[12] - '0') * 10 + (a[13] - '0') * 5 + (a[14] - '0') * 8 + (a[15] - '0') * 4 +(a[16] - '0') * 2;
 8 }
 9 
10 char s(string a)
11 {
12     int k = cal(a) % 11;
13     if (k == 0)
14         return '1';
15     else if (k == 1)
16         return '0';
17     else if (k == 2)
18         return 'X';
19     else
20         return '0'+12-k;
21 }
22 int main()
23 {
24     string number;
25     while ((cin >> number) && number != "-1")
26     {
27         if (number[17] == s(number))
28             cout << "1" << endl;
29         else
30             cout << "0" << endl;
31     }
32     system("pause");
33     return 0;
34 }    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM