标题:怎样用C语言实现身份证升位
只看楼主
李白白哈哈
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-11-17
结帖率:0
已结贴  问题点数:20 回复次数:2 
怎样用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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
嘿,连题目都没贴全。这么马虎就别搞理工科

关于身份证校验的代码,过完的帖子中多了,自己找找
2019-11-18 09:38
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:10 
你总得要有一个样例输入和输出吧,不然,谁知道做对每没做错呢?总不会让大家来打猜猜吧?
2019-11-18 16:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497880-1-1.html




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

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