一个合法的身份证号码由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
。
输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
代码:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main {
public static void main(String[] args) throws IOException {
/**
* System.in是个字节流
* InputStreamReader是个字符流和字节流之间的转换中介(将字节流转化成字符流)
* BufferedReader是个字符流
* StringBuilder修改字符串
* toCharArray()将字符串转换成字符型数组
* isempty()函数是一个判断数列A是否为空的一个函数
*/
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(bufferedReader.readLine());
char[] M={'1' ,'0', 'X' ,'9' ,'8' ,'7' ,'6','5' ,'4' ,'3' ,'2'};
int[] quan={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
StringBuilder res=new StringBuilder();
for(int i=0;i<n;i++){
String rec=bufferedReader.readLine();
char[] c=rec.substring(0,17).toCharArray();
char m=rec.charAt(17);
int sum=0;//求和
int flag=0;//统计个数
/**
* 判断前17位是否都为数字
*/
for(int j=0;j<17;j++){
if(c[j]>='0'&&c[j]<='9'){
sum+=(c[j]-48)*quan[j];
}else{
flag++;
res.append(rec);//添加
res.append("\n");
break;
}
}
/**
* 判断最后一位是否符合
*/
if(flag==0){
sum=sum%11;
if(M[sum]!=m){
res.append(rec);
res.append("\n");
}
}
}
if(res.toString().isEmpty()){//如果res为空
System.out.print("All passed");
}else{
res.deleteCharAt(res.lastIndexOf("\n"));
System.out.println(res);
}
}
}