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

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

第十八位数字等于

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

参考实现:

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

一行写法:

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

10 用 X 字符代替。