题目要求
题目分析
首先将所有的身份证号存储下来,然后依次进行判断
根据题目给定的校验方法,把前十七位的权值以及校验位都保存成一个数组,方便后面使用。
遍历存储身份证号码的数组,每拿到一个号码,就进行一次判断。判断的时候要将号码里的字符转换成数字,这里利用ASCI码的性质,将取到的字符与字符‘0’相减即可得到对应的数字,然后对前十七位取权值,并在最后得到对应的校验位。
经过比对,如果有错误,我们将这个号码存在另外一个空链表里面。
最后,通过链表的长度是否为零判断是否有不符合规范的号码,如果有,遍历链表输出即可。
示例代码
public class L1_016 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String[] arr = new String[a];
sc.nextLine();
//将所有的身份证号码都保存到一个字符串数组当中
for(int i = 0; i < arr.length; i++) {
arr[i] = sc.nextLine();
}
sc.close();
int num = 0, sum = 0;
//保存权值和校验值的数组
int[] quan = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char[] test = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
//将来用于保存出错号码的列表,因为出错号码的个数是不确定的,所以用链表表示
ArrayList<String> erro = new ArrayList<String>();
//遍历保存身份证号码的数组并进行判断
for(int i = 0; i < arr.length; i++) {
sum = 0;
//求权值
for(int k = 0; k < arr[i].length() - 1; k++) {
num = arr[i].charAt(k) - '0';
sum = sum + num * quan[k];
}
//权值对11取模并取出校验位与规定的校验位进行比较
int m = sum % 11;
if(arr[i].charAt(17) != test[m]) {
//添加到出错链表中存储
erro.add(arr[i]);
}
}
//输出结果
if(erro.size() == 0) {
System.out.println("All passed");
}else {
for(int i = 0; i < erro.size(); i++) {
System.out.println(erro.get(i));
}
}
}
}