输入18位的身份证号码,要求首先验证身份证号码合法性(仅利用校验位验证),如果合法则输出性别和出生日期。说明:
(1)身份证号码的7~12位表示出生年月;第17位表示性别,奇数为男,偶数为女;最后一位为校验位
(2)校验算法:将前面的身份证号码17位数加权求和(系数分别7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2),然后除以11,根据余数找到对应的校验位(分别为1、0、X 、9、8、7、6、5、4、3、2),如果计算的校验位和输入的校验位一致说明身份证号码合法。比如身份证号码53010219200508011x,前17位加权求和:
(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2=189
189%11 = 2
序号为2的校验位就是X,所以身份证号码合法。
package zt_text_id;
import java.util.Scanner;
public class zt_text_idmain {
public static void main(String[] args) {
System.out.println("请输入你的身份证号:");
Scanner scan = new Scanner(System.in);
String iden = scan.next();
idCard id = new idCard(iden);
System.out.println("你的身份证号"+(id.isLegal()==1?"合法":"不合法"));
if (id.isLegal()==1){
System.out.println("你的出生年月是:"+id.year());
System.out.println("性别:"+(id.sex()==1?"男":"女"));
}
}
}
package zt_text_id;
public class idCard {
private String id;
private static final byte MALE = 1;
private static final byte FAMALE = 0;
/**
* 构造函数初始化
* @param id
*/
public idCard(String id){
this.id = id;
}
/**
* 检验身份证是否合法
* @return 1-合法;0-不合法
*/
public int isLegal(){
int a = 0;
int sum = 0;
char checkBit[]={'1','0','X','9','8','7','6','5','4','3','2'};
int []add={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char []stringArr = id.toCharArray();
for (int i=0;i<17;i++){
sum +=add[i]*(stringArr[i]-'0');
}
if (stringArr[17]==checkBit[sum%11]){
a=1;
}
return a;
}
/**
* 判断性别
* @return 1-男;0-女;-1-错误;
*/
public byte sex(){
if (isLegal()==1){
char []stringArr = id.toCharArray();
if (stringArr[16]%2==0){
return FAMALE;
}else{
return MALE;
}
}
return -1;
}
/**
* 输出年月日
* @return 年月日的字符串比如:20171207
*/
public String year(){
String num=null;
if (isLegal()==1){
num = id.substring(6,14);
}
return num;
}
}
总结:编程主要的还是思路,思路清晰了写代码就容易,就比如本题,我们拿到的时候首先想输入一个身份证号,然后就要判断身份证号是否合法,等合法了我们才可以进行下一步。这样的话我们就需要一个判断身份证号是否合法的方法。当判断合法之后,我们就可以输出年月和性别了。输出年月和性别可以分别设置方法进行判断。
当然这里面存在一些bug,比如输入19个的身份证号,前18位正确,多数了一个数也会被认为正确的。