题目:
思路:
构建校验码的映射表,使用字符串数组存储输入号码。对字符串数组进行遍历,并利用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 ", num); 53 count--; 54 } 55 56 } 57 58 //判断是否全部正确 59 if (count == n)printf("All passed"); 60 61 return 0; 62 }