L1-016 查验身份证 (15 point(s))
-
之前在PAT乙级也写过,这次写完后看了看,发现自己好像少考虑了一个条件 “检查前17位是否全为数字” 。当时只看到前面的条件 “并不检验前17位是否合理” ,所以就没管写出了下面这个代码。但提交后发现也是可以AC的。
稍微想了想,这应该是钻了个漏洞的,如果前十七位存在非数字,那么加权求和的时候就可能得不到正确的 Z 值,而无法得到正确的校验码 M。这算误打误撞了。
#include <bits/stdc++.h>
using namespace std;
int main(){
int Pass = 1, N, weight[17]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
string M = "10X98765432";
cin >> N;
while(N--){
string str;
int Z = 0;
// 身份证没有空格 用cin
cin >> str;
// 计算Z
for(int i = 0; i < str.size(); i++)
Z += (str[i] - '0') * weight[i];
// 判断校验码M
if(str[17] != M[Z % 11]){
Pass = 0;
cout << str << endl;
}
}
if(Pass) cout << "All passed";
}