算身份证最后一位

今天遇到一个问题,根据身份证的前十七位算出第十八位,这个有明确的算法,如下所示:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示号码字符从右至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi---表示每一位对应的加权值。
从左到右Wi的值依次为:
Wi          7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
然后根据公式(1)计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10: 
公式计算结果              0 1 2 3 4 5 6 7 8 9 10
校验码字符值              1 0 X 9 8 7 6 5 4 3 2
这个算法实现起来倒是挺简单的,用X++里的Container比较顺手:

None.gifstatic void  GetLastNumber(str strIdentity)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Container factor 
= [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
InBlock.gif    Container c 
= [1,0,'X',9,8,7,6,5,4,3,2];
InBlock.gif    
int i;
InBlock.gif    
int j;
InBlock.gif    ;
InBlock.gif
InBlock.gif    
if(strlen(strIdentity)!=17)
InBlock.gif        
throw info("请输入17位有效数字!");
InBlock.gif
InBlock.gif    
for(i=1;i<=17;i++)
InBlock.gif        j 
+= str2int(substr(strIdentity,i,1))*conpeek(factor,i);
InBlock.gif
InBlock.gif    j 
= j mod 11;
InBlock.gif
InBlock.gif    Box::info(strfmt(
"您身份证最后一位是:%1",j==2? conpeek(c,j+1):int2Str(conpeek(c,j+1))));
ExpandedBlockEnd.gif}

当然这里没有检查每一个字符是不是有效数字。

转载于:https://www.cnblogs.com/Farseer1215/archive/2007/04/09/706211.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值