[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

编程挑战-缺失的身份证号码

本帖最后由 happy886rr 于 2017-4-10 15:36 编辑

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

评分人数

回复 2# 523066680
方法很多,最简单的还是0~9一个一个试,但是那样得用两次循环,我是用set/a逆推出数字,因此这道题最少只需for一次。

TOP

本帖最后由 happy886rr 于 2017-4-10 18:51 编辑

回复 5# 523066680
是个同余原理,三种情况,比从0~9试10次要快点。这个题身份证只是缺失一位,如果缺失两位,在知道性别的话,也能算出来,但是难度太大了。

TOP

返回列表