怎样用C语言实现身份证升位
怎样用C语言实现身份证升位,任务描述大概是这样的现在大家使用的身份证都是18位号码,其实就在几年以前,身份证都是使用的15位号码。
全中国十几亿人都要将15位的身份证号升至18位,工作量之大可想而知。现在假如你回到了身份证升位的时期,当地一个公安局想请你设计一款软件实现自动升位。
升位方法:将原十五位身份证出生年份由原来的2位升至4位(比如81升为1981,假设所有身份证的主人为1900-1999年出生)得到17位身份证码,再根据17位身份证码计算校验码,校验码加至号码尾即得18位身份证号码。
校验码是由十七位身份证码生成,生成方法如下:
校验码公式: V=(∑(ai×Wi)) (mod 11) 2≤i≤18……………………………………(1)
其中, i----表示号码字符从右至左包括校验码在内的位置序号;
ai----表示第i位置上的号码数值;
Wi----示第i位置上的加权因子(其值已定),其数值依据公式Wi=2^(i-1)(mod 11)计算得出,其中x^y表示x的y次幂,x mod y表示x除以y的余数,也就是说,Wi为(2的(i-1)次方)除以11的余数。
以34052419800101001C为例,其中C为校验码。
下面说明如何计算校验码:
计算校验码的编号,位置序号为从右到左包括校验位在内进行计算的。
身份证号: 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 C
位置序号:18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
根据公式(1)进行计算:
V=( 3*(2^(18-1) mod 11)+4*(2^(17-1) mod 11)+...+1*(2^(2-1) mod 11) ) mod 11
=(21+36+0+25+16+16+2+9+48+0+0+9+0+5+0+0+2) mod 11
= 2
然后根据计算的结果V=2,查下校验码表得,
校验码对应表
V的值: 0 1 2 3 4 5 6 7 8 9 10
校验码C: 1 0 X 9 8 7 6 5 4 3 2
查表V=2的校验码为X,所以18位号码为:34052419800101001X
输入
第一行为一个整数n(0<n≤10000); 接下来n行