黑马程序员技术交流社区

标题: java实现身份证校验的小程序 [打印本页]

作者: smhjx2006    时间: 2013-6-5 14:34
标题: java实现身份证校验的小程序
/**
*身份证号码最后一位的计算方法
*1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:
* 7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2.
*2、将这17位数字和系数相乘的结果相加。
*3、用相加的和除以11.看余数是多少?
*4、余数只可能是0-10这11个数字。这11个数字分别对应的最后一位身份证号码为:
* 1-0-X-9-8-7-6-5-4-3-2.
*/
import java.util.*;
class  IdCardDemo
{
public static void main(String[] args)
{
  Scanner console = new Scanner(System.in);
  System.out.print("请输入18位的身份证号:");
  int count = 0;//记录校验次数,最多三次
  while(true)
  {
   //通过键盘录入获取身份证号码。
   String id = console.nextLine();
   if(verify(id))
   {
    System.out.println("合法身份证号!");
    break;
   }
   else
   {
    System.out.println("非法身份证号!");
    if(++count==3)
     break;
    System.out.print("请重新输入身份证号:");
   }
  }
}
//定义方法verify,此方法计算出id的最后一位和输入的最后一位是否一致,相同返回true,不同返回false
public static  boolean verify(String id)
{
  if(id.length()!=18)
   return false;
  //定义每位身份证号码的系数
  int[] w = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
  int sum = 0;
  for(int i = 0;i<w.length;i++)
  {
   //将每一位身份证号和对应系数相乘之后相加求和,注意”charAt(i)-'0':将字符数字转换成数字
   sum+=(id.charAt(i)-'0')*w[i];
  }
  int c = sum%11;
  char[] ch = {'1','0','X','9','8','7','6','5','4','3','2'};
  char code = ch[c];
  //因程序中给出的最后一位为大写的'X',而用户可能输入小写x,所以如果最后一位是x,统一转成大写的进行判断。
  char last = id.charAt(17);
  last = last== 'x'?'X':last;
  return last == code;
}
}



作者: 袁梦希    时间: 2013-6-5 14:45
哥们很厉害   研究的很深   {:soso_e179:}
作者: 刘正祥    时间: 2013-6-5 17:02
为什么要计算身份证号码最后一位呢?{:soso_e132:}
作者: 曹秀云    时间: 2013-6-15 08:56
刘正祥 发表于 2013-6-5 17:02
为什么要计算身份证号码最后一位呢?

最后一位是计算出来的,像网上的解除防沉迷软件就是这个原理。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2