PAT B1031 查验身份证

PAT B1031 查验身份证

题目描述:

  一个合法的身份证号码由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

  输入样例2:
  2
  320124198808240056
  110108196711301862

  输出样例2
  All passed

参考代码:

 1 /****************************************************
 2 PAT B1031 查验身份证
 3 ****************************************************/
 4 #include <iostream>
 5 #include <string>
 6 
 7 using namespace std;
 8 
 9 const int WEIGHT[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
10 const char CHECK_SYM[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
11 
12 int main() {
13     int count = 0, illegalCount = 0;
14 
15     cin >> count;
16 
17     string idNum;
18     int i = 0, j = 0;
19     for (i = 0; i < count; ++i) {
20         cin >> idNum;            //读入身份证号
21 
22         int checkNum = 0;        //前17位数字与对应权重乘积之和
23         //检查身份证号前17位是否有非数字
24         for (j = 0; j < 17; ++j) {
25             if (idNum[j] - '0' < 0 || idNum[j] - '0' > 9) break;
26 
27             checkNum += (idNum[j] - '0') * WEIGHT[j];
28         }
29 
30         //如果前17位有非数字或者校验位不正确,输出错误身份证号并更新相关信息
31         if (j != 17 || idNum[17] != CHECK_SYM[checkNum % 11]) {  
32             if (illegalCount != 0) cout << endl;    //如果不是第0个出错的,需要输出换行与上一个错误身份证号隔开
33 
34             cout << idNum;
35             illegalCount++;                         //有误身份证号数量增加
36         }
37     }
38 
39     if (illegalCount == 0) cout << "All passed";    //没有错误的身份证号的情况
40 
41     return 0;
42 }

注意事项:

  1:关于有“最后一个输出之后不能有多余的空格/换行符“的要求的题目,主要有两种方法应对:

    1.1:输出结果的个数已知,可以通过判断是否已经到最后一个输出来判断是否要输出空格或者换行:

1 //输出结果数量已知
2 for (int i = 0; i < ans.size(); ++i) {
3     cout << ans[i];
4     
5     if (i != ans.size() - 1) cout << endl;
6 }

    1.2:输出结果的个数未知,可以增加一个整数辅助判断:当待输出项满足输出要求时先判断这个整数是不是初始化时的值,如果是说明这是第一个输出,输出前不需要换行;否则说明当前输出前已经有一个输出了,而这个输出后面没有换行,需要输出一个换行然后才能输出当前的输出内容。这样当前的输出后面是否有换行是由下一个输出决定的,如果之后没有输出内容,自然就没有多余的换行或者空格:

1 //输出结果数量未知
2 int wantedAnsCount = 0;
3 for (int i = 0; i < ans.size(); ++i) {
4     if (ans[i] > 100) {
5         if (wantedAnsCount != 0) cout << endl;
6 
7         cout << ans[i];
8     }
9 }

猜你喜欢

转载自www.cnblogs.com/mrdragon/p/11403396.html