1
jsthon OP |
2
wzxjohn 2014-12-24 21:54:27 +08:00
是楼主年龄太小还是我年龄太大。。。N年前用多种方法实现过这个。。。最蛋疼的是帮老师用Excel实现。。。
PS:我记得似乎高中数学会说一下这个。。。不知道是不是我们这边课本的个别现象。。。 |
3
zhengkai 2014-12-24 22:06:36 +08:00
https://soulogic.com/archives/364 n年前的困惑
楼主你想过没有,“由算法得出”跟“结尾有X”没有任何必然联系 X 的原因只不过他的算法最后一步是 mod 11,但为什么是 11 呢?如果 mod 10,或者 mod 100(这样有两个校验位)就完全没这个问题,匪夷所思 |
4
laobubu 2014-12-24 22:10:19 +08:00
昨天翻老帖子的时候还遇到过这么一篇:
http://www.v2ex.com/t/47712 其中有一个真是碉堡了 ```python get_id = lambda s:s+str((1-2*int(s, 13)) % 11).replace('10', 'X') ``` |
5
jsthon OP |
6
luikore 2014-12-24 22:36:31 +08:00 1
|
8
iyaozhen 2014-12-24 22:46:27 +08:00
涨姿势了,我一直以为x是那个县当天出生的人数太多,就用x表示了。
|
9
yaoye0o 2014-12-24 22:52:25 +08:00 via Android 1
一直以为十五位到十八位是按顺序排的四位数,虽然偶尔也会想想“0”和“X”的问题。可我作为male第十七位是“2”是怎么回事😒
|
10
wolfan 2014-12-24 22:53:41 +08:00
好像用算法得出的身份证应该是从第三代开始的吧。
|
13
jybox 2014-12-25 00:01:03 +08:00
|
14
SharkIng 2014-12-25 00:37:58 +08:00 via Android
你才知道啊
|
15
ligyxy 2014-12-25 01:01:08 +08:00 2
因为是质数,所以不会出现有仅一位出错而校验位不变的情况
|
16
Quaintjade 2014-12-25 01:20:09 +08:00 via Android 1
|
17
chigco 2014-12-25 02:27:24 +08:00 via Android
才知道。。
|
18
ericls 2014-12-25 03:37:57 +08:00 via Android
很久很久以前 就有升位计算器了。。
还有大陆生份证自动生成器 |
19
Showfom 2014-12-25 03:56:56 +08:00 via iPhone
再来科普个 电话区号的最后一位是没有0的 0代表10
所以 0570 是衢州 0571 是杭州 1最大 10最小 020 广州 021 上海 其实当初的顺序是上海最大 广州最小 |
20
xdlailai 2014-12-25 08:45:45 +08:00
我是x~~早就科普了下
|
21
rockpine 2014-12-25 08:58:04 +08:00
入公司后的一个培训检测,就是用python实现这个算法的,那也是我第一次知道最后一位是算出来的
|
22
wildplant 2014-12-25 09:13:37 +08:00 via Android
关于顺序码,会不会有不够用的情况?比如一个地方一天的出生数量多于999?
|
23
mind3x 2014-12-25 09:20:49 +08:00 via Android
|
24
66beta 2014-12-25 09:29:33 +08:00
昨天用一个沈粉蒸生成器,发现倒数4位有玄机,前2位会决定性别
|
25
tanyuxiang 2014-12-25 09:38:04 +08:00
@Showfom 0750前面这个0呢? 好像应该是570,第一个0代表长途。
|
26
plprapper 2014-12-25 10:08:54 +08:00
记得一个朋友 面试的时候被问道这个问题
|
28
ahu 2014-12-25 12:21:17 +08:00
|
29
zhengkai 2014-12-25 12:28:11 +08:00
@Quaintjade 我爱死你了,真的。疑惑了 5 年多的问题终于知道答案了,而且答案出乎我意料确实很牛逼
另外等价的 PHP 表达是(需要有 GMP 扩展,这还是刚问的,我之前都没用过这扩展) return (int)substr($id, -1) == gmp_mod(1 - base_convert($id, 13, 10) * 2, 11); |
30
zhengkai 2014-12-25 12:31:25 +08:00
@ahu (⊙o⊙) 可以再留个把月,我最近正准备翻新……比方说,上周我刚研究了一下 bootstrap ……就为了网站改版能适应各种设备,这样才有写东西的好心情
|
31
zhengkai 2014-12-25 13:03:12 +08:00
@ligyxy 似乎有点明白了,这个等有时间再细想一下,应该是奇数就可以?
我只考虑了人在键盘上输错的场景,但没考虑数字信号的问题,比方说 8 可能错按成 5(键盘的数字区),但是二者的二进制是 1000 和 0101,连平均值 1/2 都凑不到,所以在校验上远比我想象的 1/10 1/11 的区别要大啊,赞,到底是科班出身,比我这种泥腿子有先天优势 |
32
janxin 2014-12-25 13:36:47 +08:00
如果我没记错,除了身份证,银行卡也能验
|
33
ligyxy 2014-12-25 14:18:03 +08:00
@zhengkai
没看懂你的例子。这个数要满足的要求是与前面所有可能的数互质,例子是:为方便说明前面的数根先据权重变成顺序排列。假设这个数是9,那么前面的数只要最后一位+9,校验码就不变。同理1到10都不能作为这个数。所以区别并非1/10和1/11,而是0和1/17,因为小于11的话连错一位都检验不出来。 |