本帖最后由 happy886rr 于 2017-4-10 15:36 编辑
[具有挑战性的问题]- 这里给你一些不完整的身份证号码:6110251990062874?0(倒数第二位缺失,用?号替代),看你是否能根据前16位数码和最后一位校验码推测出完整的身份证号?
- 要求:不限编程语言,不限代码长度,只要能将缺失的?数字补全就行。
-
- 比如:
- 1509231988042396?9
- 3700001989091894?0
- 4313021981042877?1
- 5301021920050801?X
- 6110251990062874?0
-
- 补全后的效果是:
- 150923198804239619
- 370000198909189440
- 431302198104287701
- 53010219200508011X
- 611025199006287480
复制代码 .
.
.
以下是一些辅助信息,有助于你更快的解决该问题。
[身份证号码]- 公民的身份证号码,是由前十七位数字码和最后一位校验码构成。其中第17位如果为奇数就是男性,为偶数是女性。
复制代码 [最后一位校验码是怎么确定的?]- 将身份证号前17位数码分别乘以不同的系数,从第一位到第十七位所乘的系数分别为:7 、9 、10 、5 、8 、4 、2 、1 、6 、3 、7 、9 、10 、5 、8 、4 、2;将乘积相加,除以11,看余数是多少?
- 余数:0 、1、 2、 3、 4、 5、 6、 7、 8、 9、 10
- 对应的校验码:1 、0 、X 、9 、8 、7 、6 、5 、4 、3 、2
复制代码 [校验码计算示例]- 某人身份证号码为53010219200508011X,首先我们得出前17位的乘积和(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)是189,然后用189除以11得出的结果是189/11=17余2,也就是说余数是2。最后通过对应规则就可以知道余数2对应的校验码是X。所以,可以判定这是一个正确的身份证号码。
复制代码 [我的代码实现]
cmd脚本- @echo off
- call :start 1509231988042396?9
- call :start 3700001989091894?0
- call :start 4313021981042877?1
- call :start 5301021920050801?X
- call :start 6110251990062874?0
- pause
- exit
-
- :start <ID>
- setlocal
- set ID=%1
- set X=10
- set QI=79X584216379X58420
- for /l %%i in (0,1,15) do (
- call set/a "sum+=(%%ID:~%%i,1%%)*(%%QI:~%%i,1%%)"
- )
- set/a "r=(12-%ID:~-1%)%%11, n=(r+11-sum%%11), 1/(!(n&1))" 2>NUL ||set flag=1
- if %n% lss 11 (set/a "n+=11*flag") else (set/a "n-=11*flag")
- set/a "n>>=1"
- call echo %%ID:?=%n%%%
- endlocal
复制代码
|