PTA-1031-查验身份证

题目链接

https://pintia.cn/problem-sets/994805260223102976/problems/994805290334011392

数据范围:

N <= 100

样例:

Input:

1
2
3
4
5
6
7
8
9
10
first:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
second:
2
320124198808240056
110108196711301862

Output:

1
2
3
4
5
6
first:
12010X198901011234
110108196711301866
37070419881216001X
second:
All passed

题目做法

题意清楚 我们只需要计算一下前$17$位的$sum$,并在计算过程中,判断一下是否有$s[i]$不属于数字即可。然后在算权值的过程中,最好建一个对应的数组,便于相乘。

注意对$X$的处理,全是数字,我们尽可能的转换成同类型$int$来操作。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* Copyright(c)
* Author : tiketiskte
*/
#include <bits/stdc++.h>
#define IOS {ios::sync_with_stdio(false);cin.tie(0);}
#define ll long long
#define INF 0x3f3f3f3f

using namespace std;
int n;
string s;
bool flag;
int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int ans[11] = {1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2};
bool solve() {
int sum = 0;
for(int i = 0; i < 17; i++) {
if(s[i] <'0' || s[i] > '9') {
return false;
}
sum += (s[i] - '0') * a[i];
}
int temp = (s[17] == 'X') ? 10 : (s[17] - '0');
return temp == ans[sum % 11];
}
int main()
{
IOS
cin >> n;
flag = false;//所有的都要去满足 定义在while内部可能出现第一个满足,结果后边的不满足情况
while(n--) {
cin >> s;
if(!solve()) {
cout << s << endl;
flag = true;
}
}
if(!flag) {
cout << "All passed" << endl;
}
//system("pause");
return 0;
}

总结点

坑点:

注意$flag$的定义赋值范围,要在所有的$test$之外,要求的是,对于所有的样例都满足的时候,才可以输出$All passed$

参考资料

无(占坑)