我想知道算法,谢谢!

解决方案 »

  1.   

    18位身份号码与15位有两点差异:1 年份4位
    2 末尾加上校验码。插入年份世纪值你自己就可以做。我给你求校验值的函数:Const Wid As String = "79a584216379a5842"
    Const C9 As String = "10X98765432"'for check code for ID number
    Public Function Get_Check(ByVal x As String) As String
    Dim Temp As Long
    For i = 1 To 17
    Temp = Temp + Val(Mid(x, i, 1)) * Val("&H" & Mid(Wid, i, 1))
    Next i
    Get_Check = Left(x, 17) & Mid(C9, (Temp Mod 11) + 1, 1)
    End Function
      

  2.   

    hoho~俺把俺的15位号码按照楼上的方法算了一下,算出校验码是X,可是我现在的18位身份证最后一位是3也~
      

  3.   

    这个没问题。Public Function IdNum15To18(str15 As String) As String        num = Val(str15)
             If Mid(num, 9, 2) > 12 Or Mid(num, 11, 2) > 31 Then
                ' MsgBox "你输入的身份证号信息有错误,错误原因:数据错误!", vbCritical, "错误"
                 IdNum15To18 = "错误:数据中的 " & Mid(num, 9, 4) & " 校验错"
                 Exit Sub
              Else
                     num7 = 1        '第七个值
                     num8 = 9         '第八个值
                     num1 = Left(num, 6)        '取前六个数字
                     num2 = Right(num, 9)        '取后九个数字
                    
                     numadd = Left(num, 1) * 7 + Mid(num, 2, 1) * 9 + _
                                Mid(num, 3, 1) * 10 + Mid(num, 4, 1) * 5 + _
                                Mid(num, 5, 1) * 8 + Mid(num, 6, 1) * 4 + _
                                num7 * 2 + num8 * 1 + Mid(num, 7, 1) * 6 + _
                                Mid(num, 8, 1) * 3 + Mid(num, 9, 1) * 7 + _
                                Mid(num, 10, 1) * 9 + Mid(num, 11, 1) * 10 + _
                                Mid(num, 12, 1) * 5 + Mid(num, 13, 1) * 8 + _
                                Mid(num, 14, 1) * 4 + Right(num, 1) * 2
                     nummod = numadd Mod 11                 '和11求余数
                             If nummod = 0 Then num3 = 1
                             If nummod = 1 Then num3 = 0
                             If nummod = 2 Then num3 = "X"
                             If nummod = 3 Then num3 = 9
                             If nummod = 4 Then num3 = 8
                             If nummod = 5 Then num3 = 7
                             If nummod = 6 Then num3 = 6
                             If nummod = 7 Then num3 = 5
                             If nummod = 8 Then num3 = 4
                             If nummod = 9 Then num3 = 3
                             If nummod = 10 Then num3 = 2
                      IdNum15To18 = num1 & "19" & num2 & num3
              End If
    End Function
      

  4.   

    公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。校验码根据组合码的前十七位数字,采用ISO7064:1983,MOD 11-2校验码系统,算法如下:每一位数字与加权系数相乘,所得的积累加,将所得的和求11的余数(mod 11),在通过余数查出校验码。加权系数:(序号表示号码字符从右至左包括校验字符在内的位置)
    1   1
    2   2
    3   4
    4   8
    5   5
    6  10
    7   9
    8   7
    9   3
    10  6
    11  1
    12  2
    13  4
    14  8
    15  5
    16 10
    17  9
    18  7余数和校验码对照表:
    0  1
    1  0
    2  X
    3  9
    4  8
    5  7
    6  6
    7  5
    8  4
    9  3
    10 2