Java身份证号码校验算法实现

居民身份证号码是18位字符的编码,每个人的编码都是唯一的,校验规则如下:

∑(ai*wi)mod 11 = 1,i表示号码字符从左至右包括校验码字符在内的位置序号;ai表示第i位置上的号码字符值;Wi表示第i位置上的加权因子。即将各位上的数值乘上位权之和对11取余,余数为1则表示该编码正确。注意:如果最后一位校验码是'X'或'x',则代表该校验码的数值为10。各位的权值依次是:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1。

代码示例

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 读取换行符

        int count = 0; // 记录正确的身份证号码的个数

        for (int i = 0; i < n; i++) {
            String id = scanner.nextLine();
            if (isValidID(id)) {
                count++;
            }
        }

        System.out.println(count);
    }

    // 判断身份证号码是否正确
    private static boolean isValidID(String id) {
        if (id.length() != 18) {
            return false;
        }

        int[] weights = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};

        int sum = 0;
        for (int i = 0; i < 17; i++) {
            char c = id.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
            int num = c - '0';
            sum += num * weights[i];
        }

        char lastChar = id.charAt(17);
        int lastNum;
        if (lastChar == 'X' || lastChar == 'x') {
            lastNum = 10;
        } else if (lastChar >= '0' && lastChar <= '9') {
            lastNum = lastChar - '0';
        } else {
            return false;
        }

        return sum % 11 == (11 - lastNum) % 11;
    }
}

代码说明

  • isValidID 方法用于判断一个字符串是否是一个合法的身份证号码。
  • 代码首先判断输入的身份证号码长度是否为18位,如果不是则返回 false
  • 然后,代码根据校验规则计算校验码,并与实际的校验码进行比较。如果相同,则返回 true,否则返回 false

总结

本文介绍了使用Java语言实现居民身份证号码校验的算法,包括校验规则的解释和代码示例,并提供详细的代码注释,帮助开发者快速理解和应用该算法。


原文地址: https://www.cveoy.top/t/topic/j9XB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录