import java.util.Calendar;
import java.util.Scanner;
public class ValidateID {
public static void main(String[] args) {
ValidateID vid=new ValidateID();
System.out.println("输入身份证号码:");
Scanner sc = new Scanner(System.in);
String id = sc.nextLine();
vid.validateLastNum(id);
}
/*
* 此算法基本可以筛选所有不符合的身份证
*
* 关于身份证号码最后一位的校验码的算法如下: ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., 18 ) "*" :
* 表示乘号 i: 表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1。 a[i]: 表示身份证号码第 i 位上的号码 W[i]: 表示第
* i 位上的权值 W[i] = 2^(i-1) mod 11 设:R = ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ...,
* 18 ) C = 身份证号码的校验码 则R和C之间的对应关系如下表: R:0 1 2 3 4 5 6 7 8 9 10 C:1 0 X 9 8 7
* 6 5 4 3 2 由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。
*/
public boolean validateLastNum(String strId) {
// 判断身份证是否为18位
if (strId.length() != 18) {
return false;
}
// 把String转换为StringBuffer是为了用到reverse()方法
StringBuffer sb = new StringBuffer(strId);
// 字符串反转
sb.reverse();
// 转回来,便于操作
String id = new String(sb);
// 如果含有非数字,则直接返回false退出
try {
Long.parseLong(id);
} catch (Exception e) {
// System.out.println("该字符串只能是数字");
return false;
}
// 下面算法遵照上面的公式
int sum = 0;
int C = 0;
int[] W = new int[17];
int[] a = new int[17];
for (int i = 2; i < 19; i++) {
W[i - 2] = (int) (Math.pow(2, i - 1) % 11);
a[i - 2] = Integer.parseInt(id.substring(i - 1, i));
sum += (a[i - 2] * W[i - 2]);
}
int R = sum % 11;
// 将上面得到的结果,根据R:C对应关系,做如下转换
if (R == 0) {
C = 1;
}
if (R == 1) {
C = 0;
}
if (R == 2) {
C = 10;
}
if (R > 2) {
C = 12 - R;
}
// 截取第一个字符,即转换前的最后一个字符
String lastChar = id.substring(0, 1);
// 将截取的字符转换成数字
int lastNum = Integer.parseInt(lastChar);
// 判断身份证的最后个字符和计算得到的数据做比较,如果相等则正确,反之错误
if (lastNum != C) {
// 由于R=2对应C=10,而10在身份证中用X表示,所以可通过验证下面两个条件是否同时满足来判断
if (C == 10 && lastChar.equals("X")) {
// System.out.println("身份证通过校验码验证");
return true;
}
// System.out.println("身份证未能通过校验码验证");
return false;
}
// System.out.println("身份证通过校验码验证");
return true;
}
}相关推荐
身份证号码验证算法深入研究和Java实现
主要介绍了身份证号码验证算法深入研究和Java实现,本文讲解了18身份证号码的结构、根据17位数字本体码获取最后一位校验码程序实例等内容,需要的朋友可以参考下
身份证号码的校验
注意:以上正则表达式只能验证身份证的格式是否正确,并不能保证身份证号码的真实性。身份证号码的校验规则在不同国家和地区可能存在差异,建议在具体使用中再做进一步验证。18位身份证号码格式:前6位为地址码,7到14位为出生日期码,15到17位为顺序码,18位为校验码。15位身份证号码格式:前6位为地址码,7到12位为出生日期码,13到15位为顺序码。
手把手教你用Ubuntu Desktop搭建个人L2TP服务器,手机电脑都能连(Network Manager配置详解)
本文详细介绍了在Ubuntu Desktop上使用Network Manager图形化配置L2TP服务器的方法,实现手机、电脑等多设备安全连接。从环境准备、图形界面设置到各平台客户端配置,提供一站式解决方案,并包含常见问题排查与安全增强措施,帮助用户快速搭建个人远程访问网络。
18位身份证号验证算法的原理以及C#实现和在管理系统的应用
18位身份证号验证算法的原理以及C#实现和在管理系统的应用 本博文介绍一下我自主开发的企业工资管理系统中关于员工18身份证号合法性验证的原理以及采用C#实现的代码、在实际的管理系统中应用!经过我自己的测试,是可以用的,而且代码我觉得写的不错!若有哪位博友想获取我这个管理系统的源码以及相关设计文档(可以当做“毕业设计”哦),可以加我QQ:1948831260与我交流,我愿意考虑出售给你!当...
Java 开发 修改【冒险岛 079 私服】完整学习流程
第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。
CCF CSP历年题解(python)
菜鸡一枚,没参加过算法竞赛,单纯为了抵研究生考试复试才刷题,通过写博客记录下来,希望能和大家互相交流,代码质量不高,大家见谅。 因为考研等原因,题目不定期更新… 第一题 201312-1出现最多次数的数 ...
CCF-训练50题-NO.11-身份证校验
较难的题目才有分析哟~其余题目均是本人最精简代码...
本地部署DeepSeek连接MATLAB:打造私有化AI编程助手全攻略
大型语言模型(LLM)通过理解自然语言生成代码、解释技术概念,其核心原理是基于海量数据训练的Transformer架构。这项技术为工程计算和数据分析带来了效率革命,尤其在代码生成、调试辅助和文档自动化等场景价值显著。开源模型如DeepSeek-coder凭借优秀的代码理解能力,结合Ollama提供的本地化部署方案,实现了完全离线、低延迟的私有化部署。通过配置国内镜像加速下载,并利用MATLAB内置的HTTP通信函数构造API请求,工程师可以在熟悉的MATLAB环境中直接调用本地模型,处理数据清洗、算法验证等
校验码及其计算
一个编码系统的码距时整个编码系统中任意两个码字的最小距离,(可以理解为传输形式是几位码距就是几)例:若我想要传输两个二进制数A=1,B=0;当码距是1时的传输形式为A=1;B=0;当码距是2时的传输形式为A=11;B=00;当码距是3时的传输形式为A=111;B=000;由上可见,(通讯链路相对靠谱一般只会错一位不会错多位)当码距为1时,则会用一位数1直接传输,即用1,0来传输若A,B,若通讯链路出现故障将1传输成0输出,此时根本无法判断最初传输的是A还是B,甚至根本无法判断传输是否出错。
【WRF-Chem教程-附录B】使用 MOZART 与WRF-Chem
使用MOZART与WRF-Chem
CUDA&PCL 点云体素下采样
CUDA&PCL 点云体素下采样
18位身份证校验码验证算法
function checkCode(card){ if (/^\d{17}[\dxX]$/.test(card)) { var a = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]; var valide = [1,0,'X',9,8,7,6,5,4,3,2]; ...
C和C++Everything教程的简介
C和C++Everything教程的简介 C和C++Everything教程,该专栏目前已有8000博文,订阅该专栏相当于同时订阅以下所有收费专栏
身份证校验码算法详解:从Java代码到数学原理,手把手教你实现最后一位验证
本文详细解析了身份证校验码的数学原理与实现方法,涵盖Java和Python的多语言代码示例。通过加权因子设计和模11运算,手把手教你如何验证身份证最后一位校验码,适用于前端和Java开发者的实际应用场景。
图像处理入门007:图像处理中的数学基础:线性代数与卷积
一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
7-8 查验身份证 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
7-8 查验身份证 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为: {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 ...
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
Java身份证号码严格验证(第18位校验码算法实现)
/** * 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码, * 第18位为校验码。检验码分别是0-10共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。 * 当今的身份证号码有15位和18位之分。1985年我国实行居民身份证制度,当时签.
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
7-1 查验身份证 (15 分)
7-1 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6...
PTA:7-54 查验身份证 (20分)
7-54 查验身份证 (20分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6...
第3章-2 查验身份证 (15 分)
第3章-2查验身份证(15分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9...
身份证第18位校验码验证
* 函数功能:身份证第18位校验码验证 ********************************************************** PARAMETER SFZHM DYZ="79X584216379X5842" &&与身份证前17位相对应的码。X代表10 YZZ="0123456789X" &&X代表10 XYM="10X98765432" &&校验码
身份证有效性的验证
public class IdCardVerify { public static boolean idCardVerify(char[] idCardNum){ //身份证的编码规则(18位) //前六位是地区代码,第七位到第十四位出生年月日,第十五、十六为派出所代码,第十七为是性别,最后一位是校验码 //校验的计算公式:身份证最后一位=从左到右身份证的数字乘以加权因子求和 % 11 int sum=0; int[].
18位身份证验证方法
相关链接: .NET 15位身份证升级到18位的算法 18位身份证验证方法 Private Function CheckCidInfo(ByVal cid As String) As String Dim aCity() As String = {"", "", "", "", "", "",
PAT 乙级 JAVA 1031 1031 查验身份证 (15分)
1031查验身份证(15分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。 输入格式:..
3.6 PAT A1031 查验身份证 (15分)(字符串处理)
1031 查验身份证 (15分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8...
1098



被折叠的 条评论
为什么被折叠?



