身份证校验码
很早之前就知道这回事,但是学过代数之后再回头看国家标准里前前后后的模 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