3
phuslu OP http://www.newsmth.net/bbscon.php?bid=284&id=95592
get_id = lambda s: s + '1X864209753'[int(s, 13) % 11] |
4
est 2012-09-14 15:26:14 +08:00
@phuslu 这个是错的。原版算法如下:
http://www.keakon.net/2009/03/07/%E7%94%A8Python%E8%AE%A1%E7%AE%97%E8%BA%AB%E4%BB%BD%E8%AF%81%E6%A0%A1%E9%AA%8C%E7%A0%81 1. 将号码的前17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2. 将这17位数字和系数相乘的结果相加。 3. 用加出来和除以11,得到余数。 4. 余数的结果只可能为0 1 2 3 4 5 6 7 8 9 10这11种,分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。 |
5
shector 2012-09-15 22:19:50 +08:00
@est 那个没错吧,系数其实是 2^i % 11 (i 从右侧算起),当作 13 进制的话乘的 (11 + 2)^i % 11 正好是 2^i % 11.
|
6
aristotle9 2012-09-16 00:20:40 +08:00
@shector
是这样的,不过13进制的最右位指数是0而不是1,导致结果的余数是原来余数乘13前的余数,最终的查找表作相应的修正: "1X864209753",生成代码(Haskell)为 ["10x98765432" !! (x * 2 `mod` 11) | x <- [0..10]] |
9
fuxkcsdn 2012-09-16 11:30:11 +08:00
get_id('12345678910111213')
虽然简短,但完全没验证... JS蛋疼版 function getId(s){for(var i=0,n=0;i<17;)n+=parseInt(s.charAt(i),10)*(parseInt("68947310526894731".charAt(i++),10)+1);return s.slice(0,17)+"10X98765432".charAt(n%11);} |
10
Jet 2012-09-16 19:43:19 +08:00
我靠,从上述数字中惊讶发现了自己的银行密码...
|
11
est 2012-09-20 13:34:12 +08:00
|
12
bitsmix 2012-09-20 13:49:37 +08:00
|
13
ljbha007 2012-09-20 14:36:34 +08:00
良民证是什么?
|