描述:
我国国标〖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
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
|
校验码
|
1
|
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
|
1
|
5
|
1
|
9
|
4
|
9
|
1
|
2
|
3
|
1
|
2
|
||||
积
|
7
|
9
|
5
|
20
|
2
|
9
|
24
|
27
|
7
|
18
|
30
|
5
|
4
|
得到和为:167;则模为y=167%11=2
查(3)得校验码为X(大写)
请按上面所述步骤编程,输入一个二代身份证号,检查该身份证是否正确。
输入:输入若干行,每行一个身份证号码,最后一行输入-1
输出:输出1代表正确,0代表错误
input:
120223198902021249
130132199210293822
130402198207290622
-1
output:
1
1
0
#include<iostream>
#include<string>
using namespace std; int cal(string a)
{
return (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * +(a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * + (a[] - '') * +(a[] - '') * ;
} char s(string a)
{
int k = cal(a) % ;
if (k == )
return '';
else if (k == )
return '';
else if (k == )
return 'X';
else
return ''+-k;
}
int main()
{
string number;
while ((cin >> number) && number != "-1")
{
if (number[] == s(number))
cout << "" << endl;
else
cout << "" << endl;
}
system("pause");
return ;
}