--------------------------------------------------------------------------------------------------------------------------------------------------------
时间限制:1秒 空间限制:32768K 代码长度限制 100 KB
--------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得 到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入描述:
输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出描述:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常, 则输出“All passed”。
输入例子:
4 320124198808240056 12010X198901011234 110108196711301866 37070419881216001X
输出例子:
12010X198901011234 110108196711301866 37070419881216001X
--------------------------------------------------------------------------------------------------------------------------------------------------------
实现思路:
(1).将字符串拆解成字符数组,然后取前17位进行判断是否全部为数字,如果否,直接打印;
(2).如果前17位均为数字,将各位数加权求和后取余,然后与指定值进行比对,不符合要求,直接打印;
(3).需要注意,可以用isContainNotLegal记录是否产生过不合法身份证号,如果产生过,不输出“All passed”。
--------------------------------------------------------------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a1;
import java.util.Scanner;
public class Main_a1_021 {
static int [] quan = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
static char[] M = {'1','0','X','9','8','7','6','5','4','3','2'};
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int n = scan.nextInt();
String[] idCards = new String[n];
for (int i = 0; i < n; i++) {
String id = scan.nextLine();
if(id == null || id.isEmpty()){
id = scan.nextLine();
}
idCards[i] = id;
}
boolean isContainNotLegal = false;
for (int i = 0; i < idCards.length; i++) {
boolean isLegal = isLegalIDCard(idCards[i]);
if(!isLegal){
isContainNotLegal = true;
System.out.println(idCards[i]);
}
}
if(!isContainNotLegal){
System.out.println("All passed");
}
}
}
public static boolean isLegalIDCard(String IDCard){
char[]nums = IDCard.toCharArray();
int k = 0;
for (int i = 0; i < nums.length-1; i++) {
if(nums[i] <= '9' && nums[i] >= '0'){
k = k + ((nums[i] - '0')*quan[i]);
}else{
return false;
}
}
int m = k%11;
if(M[m] == nums[nums.length-1]){
return true;
}
return false;
}
}