身份证升位

这里是一个旧身份证15位的在线升位程序,18位的身份证号码是在原15位身份证号码的第六位和第七位间 加入了“19”两位数字,目的是解决“千年虫”问题。然后再根据这样产生的17位数生成一个校验数加在最后,这里只介绍该校样数的产生算法:

//使用SPARKS语言,定义%为取余运算符//
procedure idNoProof()
integer i,num;
char proof;
integer idcode(1:17);
num=0
for i=17 to 1 by -1 do
num=num+( 2^i % 11 ) * (idcode(18-i));
repeat
num=num %11
case num
:0 : proof=’1′
:1 : proof=’0′
:2 : proof=’X’
:else : proof=(char)(12-num)

end idNoProof

能不能口算或者用简单笔算出来这个校样数呢?答案是肯定的,程序中多次利用了除以11的余数,而商是没有用的,所以针对人的算法是这样的(只有产生num的值部分):

num=0 ,j=1//从现在开始要记住num的值//
for i=1 to 17 do //从最后一位开始算,能简单不少//
j=(2*j) mod 11
//j 的值是2的i次方除以11的余数,当然运算时前面还有句“if 2*j>11 then”//
num=(j*idcode(18-i) mod 11 + num)mod 11
repeat
运算中只需要记着每次变化后的j和num的当前值就可以了,运算的次数理论上最坏的情况下会求除以11的余数51次,千万不要犯错:)

升位器如下

相关文章:

本站访问计数本站访问计数本站访问计数本站访问计数本站访问计数本站访问计数本站访问计数本站访问计数

Copyright © 2001-2008dzxr.com 给我发邮件 保留所有权利 蜀ICP备05004894号