身份证号的校验码

校验公式

身份证号一共18位,各个位置上的号码字符值应满足以下公式的校验:

\sum_{i=1}^{18}(a_i\times W_i)\equiv 1(mod\ 11)

其中,i     表示从右到左包括校验码字符在内的位置序号;

          a_i    表示第i个位置上的号码字符值;

          W_i   表示第i个位置上的加权因子,其计算公式为W_i=2^{i-1}(mod\ 11)

加权因子表如下,

i181716151413121110987654321
W_i79105842163791058421

校验码的计算

i=1时,W_i=1,校验公式可写成:

a_1+\sum_{i=2}^{18}(a_i\times W_i)\equiv 1(mod\ 11)

显然,校验码a_1的取值范围是0\leq a_1\leq10;当a_1取值为10时,用罗马数字X表示。

由校验公式推得,

a_1+\sum_{i=2}^{18}(a_i\times W_i)(mod\ 11)\equiv 1(mod\ 11)

a_1\sum_{i=2}^{18}(a_i\times W_i)(mod\ 11)的换算关系如下表所示,

\sum_{i=2}^{18}(a_i\times W_i)(mod\ 11)012345678910
a_110X98765432

实例

某公民身份证号本体码为51078107010228001,其校验码计算过程如下,

\sum_{i=2}^{18}=5\times 7+1\times9+0\times10+7\times5+8\times8+1\times4+0\times2+7\times1+0\times6+1\times3+0\times7+2\times9+2\times10+8\times5+0\times8+0\times4+1\times2=237

237\div 11=21\frac{6}{11},即\sum_{i=2}^{18}(a_i\times W_i)(mod\ 11)为6。

查表得校验码a_1为6。

该公民身份证号为510781070102280016。

代码

判断身份证号是否有误

"""判断身份证号是否有误"""
def fun1():
    string=input("请输入身份证号:")
    if len(string)!=18:
        print("输入的身份证号位数错误!")
        return
    list=[]
    for i in string:
        if i=='X':
            i='10'
        list.append(int(i))  #列表解析法,将字符串转换为整型数字
    num=0
    for i in range(0,18):
        num+=list[17-i]*(2**i%11)
    if num%11==1:
        print("身份证号无误。")
    else:
        print("身份证号有误!")
fun1()

计算身份证号的校验码

"""计算身份证号的校验码"""
def fun2():
    string=input("请输入身份证号前17位:")
    if len(string)!=17:
        print("请输入身份证号的前17位!")
        return
    list=[int(i) for i in string]  #列表解析法,将字符串拆分为整型数字
    num=0
    for i in range(1,18):
        num+=list[17-i]*(2**i%11)
    rem=num%11
    a=(12-rem)%11
    a=str(a)
    if a=='10':
        a='X'
    print("校验码为"+a)
fun2()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值