| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2207 人关注过本帖
标题:怎样用C语言实现身份证升位
取消只看楼主 加入收藏
李白白哈哈
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-11-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
怎样用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行
搜索更多相关主题的帖子: 位置 校验 计算 号码 身份证 
2019-11-17 20:15
快速回复:怎样用C语言实现身份证升位
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014632 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved