zoukankan      html  css  js  c++  java
  • 身份证号校验位算法

    大家都知道新身份证号的第18位是校验位,很多游戏玩家感觉有点小烦。因为游戏一般有防沉迷系统,要求输入身份证号,但很大一部分游戏玩家不想输入自己的真实信息,只想偶尔玩玩,随便输入一个又不对,所以,我给大家介绍下关于身份证号的校验位算法。

    大家百度一下一般都知道身份证号的第18位和算法,以下是百度原文(某一个结果)

    身份证第18位(校验码)如何计算
    创建于2018-04-05 22:33
    大家可能很少会计算身份证第18位的校验码的吧?就让大家了解了解以备不时之需吧!
    方法
    1
    1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。然后将这17位数字和系数相乘的结果相加
    
    2
    用加出来的和除以11,看余数是多少,余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
    
    3
    通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是10,身份证的最后一位号码就是罗马数字x。大概的方法就是这样了。
    百度身份证号校验位算法

    其他的结果也大同小异。但那17个系数是怎么算出来的呢?估计一般都很难找到答案了。其实那17个数字也是算出来的,不是随机选择的。后面的结果是一个总和对11取余数再做相应的移位操作。而那17个系数也有类似操作。具体的算法是第一位是6的三次方对11取余数,6^3=216=11*19+7,即第一位校验位为7,第2位是6的4次方对11取余数,结果为9,以后每一位都是6的方次加1再对11取余的结果。当然,你不用把每一个方次算出来再取余数,可以边算边取余数。(简单证明如下:任何两个正数a和b,不防设a和b对11的余数为m和n,即存在整数x和y,使得a=11x+m,b=11y+n,ab=(11x+m)(11y+n)=121xy+11xn+11ym+mn=11(11xy+ym+xn)+mn,易知(a*b)%11=(m*n)%11)。比如:(6^3)%11=(((6^2)%11)*6)%11=((36%11)*6)%11=18%11=7。即知道第一个系数是7。第2个系数则直接用(7*6)%11=9,第三个系数为(9*6)%11=10,……,便可轻松得到17个系数,基本都是100以内的乘法和除法。最后有一个移位操作,把身份证号各位数乘以各位系数的总和再对11取余,余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。这个对应关系也别做个啥子表一样的,还得查表,你把后面那个结果(1-0-X -9-8-7-6-5-4-3-2)换个写法:12-11-10-9-8-7-6-5-4-3-2,就知道对应关系了,就一个简单的减法,把之前得到的余数,用12去减就好了,再对11取余数。比如身份证号前17位全是1(当然不可能有这样的身份证号,只是为了方便算而设的例子),那身份证号各位与各位系数乘积的和为7+9+10+5+8+4+2+1+6+3+7+9+10+5+8+4+2=98,取余数后得10,用12去减得2,即为第18位数字。

    如有不妥请指教。

    素材来源于网络。

  • 相关阅读:
    【Codeforces 1051D】Bicolorings
    【Codeforces 827B】High Load
    【Codeforces 1006D】Two Strings Swaps
    【Codeforces 1108E1】Array and Segments (Easy version)
    【Codeforces 1141E】Superhero Battle
    【Codeforces 1042D】Petya and Array
    springmvc jar包下载 提供地址
    tomcat 8 startup.bat启动乱码问题
    js 对象数组删除和查找的方法
    sql 获取每个分组的前N条记录的写法
  • 原文地址:https://www.cnblogs.com/wendcn/p/10789258.html
Copyright © 2011-2022 走看看