问题描述
如果身份证的前17位有一个不为数字,则这个身份证为错误,我们直接将其输出。如果前17位都是数字,我们就按照规则比较最后一位。
题目分析
我们先给定一个权值矩阵weight,长度为17。按照身份证各位数字与权重相乘并相加所得结果对11取模。再创建一个char矩阵M,长度也为17。将最后一位数字与这个M数组中的对应位置作比较,若符合要求,则跳过,不符合直接输出。
我们还要设置一个变量mistake,表示出错的身份证数目,若最后mistake==0,则我们输出"All passed".
代码
#include <iostream>
#include <string>
#include <map>
using namespace std;
int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//各个位置权重
char M[11] = {'1','0','X','9','8','7','6','5','4','3','2'};//%11的模结果对应的最后一位
int main()
{
int number;//身份证号数
cin>>number;
string id;
int mistake = 0;
int flag;
for(int i = 0;i < number;i++)
{
cin>>id;
int sum = 0;
flag = 0;
if(id.length() != 18)
{
cout<<id<<endl;
mistake+=1;
continue;
}
else
{
for(int j = 0;j < id.length() - 1;j++)
{
if(id[j] - '0' > 9 || id[j] - '0' < 0)
{
cout<<id<<endl;
mistake+=1;
flag = 1;
continue;
}
else
{
sum += (id[j] - '0') * weight[j];
}
}
}
if(flag == 1)
continue;
int rest = sum % 11;
if(id[id.length() - 1] != M[rest])
{
cout<<id<<endl;
mistake+=1;
}
}
if(mistake==0)
cout<<"All passed";
return 0;
}
总结
答题用时9min
Q31——finish√