身份证校验码

很早之前就知道这回事,但是学过代数之后再回头看国家标准里前前后后的模 11 运算,其实也没有必要,所谓的查表也是。最后算一次就好了。

输入十七位数字串 $\{a_0, a_1, \cdots a_{16}\}$。

第十八位数字等于

$$a_{17} \equiv 1-\sum_{i=0}^{16} {2^{17-i} a_i} \pmod {11}.$$

参考实现:

def last_number(input):
    s = 0
    for i in range(17):  # from 0 to 16
        s += 2**(17-i) * input[i]
    return (1 - s) % 11

一行写法:

last_number = lambda input: (1 - sum([input[i] * 2**(17-i) for i in range(17)])) % 11

10 用 X 字符代替。

另外,程序上,往往还可以用按位左移的写法来代替系数 $2^{17-i}$:

def last_number(input):
    s = 0
    for i in range(17):
        s += input[i] << (17 - i)
    return (1 - s) % 11