根据身份证号码前17位计算出最后一位

背景:
当你的孩子出生后,你知道父母的身份证编号,想知道孩子的身份证怎么办?
通过golang 计算出孩子最后一个数字,前面的数字有规律
比如
父亲的身份证是:
110102198505191114
母亲的身份证是:
110102198706102341

假设还在出生日期为 20190330 男孩 跟随父亲户口
假设20190330当天出生的孩子不超过5个
那么孩子的身份证号码可能为如下几个
110102201903301117
110102201903301133
11010220190330115X
110102201903301176
110102201903301192

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var prc string
    for {
        fmt.Println("")
        fmt.Println("请输入身份证号码的前17位:")
        if _, err := fmt.Scanf("%d", &prc); err != nil {
            fmt.Printf("%s\n", err)
            return
        }
        if prc == "exit" {
            fmt.Println("退出成功~")
            return
        } else if 17 == len(prc) {
            checkPRC(prc)
        } else {
            fmt.Printf("你输入身份证的长度不够【%q】,请重新输入.\n", prc)
        }
        fmt.Println("输入【exit】程序退出~")
    }
}

func checkPRC(prc string) {
    sum := 0
    factor := [17]int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
    for k, v := range prc {
        n, _ := strconv.Atoi(string(v))
        sum += n * factor[k]
    }
    sum = sum % 11
    mapping := map[int]string{
        0:  "1",
        1:  "0",
        2:  "X",
        3:  "9",
        4:  "8",
        5:  "7",
        6:  "6",
        7:  "5",
        8:  "4",
        9:  "3",
        10: "2",
    }
    fmt.Println(mapping[1])

    if lastPlace, ok := mapping[sum]; ok {
        fmt.Printf("身份证号码前17位【%s】对应的最后一位是【%s】", prc, lastPlace)
        fmt.Println()
        fmt.Printf("完整的身份证号码为:【%s%s】", prc, lastPlace)

    } else {
        fmt.Printf("系统异常,身份证号码%s", prc)
    }
    fmt.Println()

    return
}

你可能感兴趣的:(根据身份证号码前17位计算出最后一位)