*小星星 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日

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图