1031 查验身份证 (15分)(Java 题解)

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);
	}
}

相关

PAT - 乙级 - 题解集

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值