*小星星 2023-04-01 20:46 采纳率: 97.2%
浏览 14
已结题

用Java程序实现身份证验证?

如何根据下面要求实现身份证校验

新的身份证号码采用GB11643-1999国家标准编制,由18位数字组成:前6位为行政区划代码,第7至14位为出生日期码,第15至17位为顺序码,女性的17位数字为偶数,男性为奇数;第18位为校验码。原15位身份证可在原两位出生年份的基础上补充两位,形成完整的出生年份信息后,在号码的最后加入校验码升级为18位新号码。第18位校验码计算的方法如下:

(1)将身份证号码前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584216379105842。

(2)将身份证号码的前17位数字和对应的系数相乘,再对结果求和,然后用此和除以11求余数,余数只可能有012345678910这11个数字。

(3)余数012345678910分别对应身份证最后一位的校验码为10X 98765432(校验码为X时,实际上采用的是罗马数字10的写法,在此X为大写字母)。

按照上述步骤计算出的前17位身份证的校验码和待验证身份证号码的最后一位字符相一致时,则此身份证为有效证件号。

  • 写回答

4条回答 默认 最新

  • CSDN专家-sinJack 2023-04-01 20:55
    关注
    
    public static boolean checkID(String id) {
        if (id == null || id.length() != 18) { // 身份证号码长度不为18位,直接返回false
            return false;
        }
        int[] coefficients = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 前17位数的系数
        char[] valids = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; // 余数对应的校验码
        int sum = 0; // 前17位数和系数乘积之和
        for (int i = 0; i < 17; i++) {
            char c = id.charAt(i);
            if (c < '0' || c > '9') { // 前17位数中有非数字
                return false;
            }
            sum += (c - '0') * coefficients[i];
        }
        int remainder = sum % 11; // 取余数
        char valid = valids[remainder]; // 余数对应的校验码
        char last = id.charAt(17); // 身份证号码的最后一位
        if (valid == last) {
            return true; // 校验码正确,返回true
        } else {
            return false; // 校验码不正确,返回false
        }
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月1日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答