1031 查验身份证 (15分)
原题链接:传送门
一、题目:
输入样例 1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例 1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例 2:
2
320124198808240056
110108196711301862
输出样例 2:
All passed
二、解析:
思路:
先检验前17位是否是数字(用正则),再根据权重算正确值。判断输入的身份证最后一位是否是正确值。
AC代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
/**
* 1031 查验身份证 (15分)
*
* @思路:先检验前17位是否是数字(用正则),再根据权重算正确值。判断输入的身份证最后一位是否是正确值。
* @author: ChangSheng
* @date: 2019年12月29日 下午10:04:45
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int[] weights = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char[] M = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
StringBuilder sb = new StringBuilder();
Integer N = Integer.valueOf(in.readLine());
for (int i = 0; i < N; i++) {
String sfz = in.readLine();
String sfzFront17 = sfz.substring(0, 17);
if (sfzFront17.matches("\\d+")) { // 校验前17位是否都是数字
// 算权重对应值
int sum = 0;
for (int j = 0; j < sfzFront17.length(); j++) {
int sfzNum = sfzFront17.charAt(j) - 48;
sum = sum + sfzNum * weights[j];
}
char rightLast = M[sum % 11]; // 最后一位正确值
if (sfz.charAt(17) != rightLast) sb.append(sfz + "\n"); // 输入的身份证最后一位是否是正确值
} else {
sb.append(sfz + "\n");
}
}
if (sb.length() == 0) System.out.print("All passed");
else System.out.print(sb);
}
}