查验身份证
一个合法的身份证号码由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、
代码示例:
include
using namespace std;
bool judge(int z, int m)
{
int M[11] = { 1,0,10,9,8,7,6,5,4,3,2 };
return M[z] == m;
}
int main()
{
int N;
cin >> N;
cin.ignore();
int sign = 0;
while (1)
{
string s;
getline(cin, s);
char a[17] = { 0 };
for (int i = 0;i < s.size() - 1;i++)
{
a[i] = s[i] - '0';
}
int num = a[0] * 7 + a[1] * 9 + a[2] * 10 + a[3] * 5 + a[4] * 8 + a[5] * 4 + a[6] * 2 + a[7] * 1 + a[8] * 6
+ a[9] * 3 + a[10] * 7 + a[11] * 9 + a[12] * 10 + a[13] * 5 + a[14] * 8 + a[15] * 4 + a[16] * 2;
int end = s[s.size() - 1];
if (end == 'x' || end == 'X')
end = 10;
else
end = end - '0';
if (!judge(num % 11, end))
{
sign = 1;
cout << s << endl;
}
N--;
if (N == 0)
break;
}
if (!sign)
{
cout << "All passed" << endl;
}
system("pause");
return 0;
}
天梯赛的一道题,挺复杂,可以回头多看看
浙公网安备 33010602011771号