PAT-字符串处理-B 1031 查验身份证 (15分)

题目:

思路:

  构建校验码的映射表,使用字符串数组存储输入号码。对字符串数组进行遍历,并利用num[i]-'0'进行运算和判断是否符合题目条件(前17位不出现字母),对求和结果进行取模并由映射表进行判断,依据前述的各种判断,输出结果

注意点:

  利用数组存储输入数字,存储权重;利用映射表存储校验码对应关系

代码:

  

 1 #include<iostream>
 2 #include<unordered_map>
 3 using namespace std;
 4 
 5 //映射表
 6 int z[11] = { 0,1,2,3,4,5,6,7,8,9,10 };
 7 char m[11] = { '1','0','X','9','8','7','6','5','4','3','2' };
 8 //权重表
 9 int wt[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
10 //号码
11 char num[110];
12 
13 int main()
14 {
15     unordered_map<int, char> p;
16     int n, count;
17 
18     //构建映射表
19     for (int i = 0;i < 11;i++)p[z[i]] = m[i];
20 
21     scanf("%d", &n);
22     //记录正确号码数
23     count = n;
24     for (int i = 0;i < n;i++)
25     {
26         scanf("%s", num);
27         int sum = 0;
28         bool flag = true;
29 
30         //进行运算
31         for (int i = 0;i < 17;i++)
32         {
33             //对每位数值进行运算并判断
34             if ((num[i] - '0') >= 0 && (num[i] - '0') <= 9)
35             {
36                 sum += (num[i] - '0')*wt[i];
37             }
38             else
39             {
40                 flag = false;
41                 break;
42             }
43         }
44 
45         //判断是否对应校验码
46         if (flag)
47             if (p[sum % 11] != num[17])flag = false;
48 
49         //输出不合格号码
50         if (!flag)
51         {
52             printf("%s\n", num);
53             count--;
54         }
55 
56     }
57 
58     //判断是否全部正确
59     if (count == n)printf("All passed");
60 
61     return 0;
62 }
View Code

 

posted @ 2020-03-08 22:17  方知有  阅读(197)  评论(0编辑  收藏  举报