1031 查验身份证 (15分) Java题解 PAT (Basic Level) Practice (中文)

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);
	}
}
发布了86 篇原创文章 · 获赞 104 · 访问量 6643

猜你喜欢

转载自blog.csdn.net/weixin_44034328/article/details/103786040