算法训练:身份证号码升级

问题描述

  从1999年10月1日开始,公民身份证号码由15位数字增至18位。(18位身份证号码简介)。升级方法为:
  1、把15位身份证号码中的年份由2位(7,8位)改为四位。
  2、最后添加一位验证码。验证码的计算方案:
  将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2。
  请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码。假设所有要升级的身份证的四位年份都是19××年

输入格式

  一个15位的数字串,作为身份证号码

输出格式

  一个18位的字符串,作为升级后的身份证号码

样例输入

110105491231002

样例输出

11010519491231002x

数据规模和约定

  不用判断输入的15位字符串是否合理

傻傻憨憨之做法:没想到可以直接建立数组然后查表,直接挨着枚举,。。。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 int main(void)
 5 {
 6     char dentity[15] = {0};
 7     char Dealdentity[18] = { 0 };
 8     int i,j;
 9
10     for (i = 0; i < 15; i++)
11     {
12         scanf("%c", &dentity[i]);
13     }
14
15     for (i = 0; i < 6; i++)
16     {
17         Dealdentity[i] = dentity[i];
18     }
19     int temp = i;
20     Dealdentity[i++] = ‘1‘;
21     Dealdentity[i++] = ‘9‘;
22
23     for (j = temp; j < 15; j++) //j = 8
24     {
25         Dealdentity[i++] = dentity[j];
26     }
27
28     int sum = 0;
29     sum = (Dealdentity[0]-48) * 7 + (Dealdentity[1]-48) * 9 + (Dealdentity[2]-48) * 10 + (Dealdentity[3]-48) * 5 + (Dealdentity[4]-48) * 8 + (Dealdentity[5]-48) * 4
30         + (Dealdentity[6]-48) * 2 + (Dealdentity[7]-48) * 1 + (Dealdentity[8]-48) * 6 + (Dealdentity[9]-48) * 3 + (Dealdentity[10]-48) * 7 + (Dealdentity[11]-48) * 9
31         + (Dealdentity[12]-48) * 10 + (Dealdentity[13]-48) * 5 + (Dealdentity[14]-48) * 8 + (Dealdentity[15]-48) * 4 + (Dealdentity[16]-48) * 2;
32     int Dsum = sum % 11;
33     //printf("%d %d", sum,Dsum);
34     switch (Dsum)
35     {
36     case 0:Dealdentity[i++] = ‘1‘;
37         break;
38     case 1:Dealdentity[i++] = ‘0‘;
39         break;
40     case 2:Dealdentity[i++] = ‘x‘;
41         break;
42     case 3:Dealdentity[i++] = ‘9‘;
43         break;
44     case 4:Dealdentity[i++] = ‘8‘;
45         break;
46     case 5:Dealdentity[i++] = ‘7‘;
47         break;
48     case 6:Dealdentity[i++] = ‘6‘;
49         break;
50     case 7:Dealdentity[i++] = ‘5‘;
51         break;
52     case 8:Dealdentity[i++] = ‘4‘;
53         break;
54     case 9:Dealdentity[i++] = ‘3‘;
55         break;
56     case 10:Dealdentity[i++] = ‘2‘;
57         break;
58     }
59     for (i = 0; i < 18; i++)
60     {
61         printf("%c", Dealdentity[i]);
62     }
63
64     return 0;
65 }

直接建立数组查表:

 1 #include<stdio.h>
 2 int xishu[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
 3 char jieguo[11] = { ‘1‘,‘0‘,‘x‘,‘9‘,‘8‘,‘7‘,‘6‘,‘5‘,‘4‘,‘3‘,‘2‘ };
 4 int main()
 5 {
 6     char a[18];
 7     int b[18];
 8     int i, sum = 0;
 9     gets(a);
10     for (i = 14; i >= 6; i--)
11         a[i + 2] = a[i];
12     a[6] = ‘1‘;
13     a[7] = ‘9‘;
14     for (i = 0; i < 17; i++)
15     {
16         b[i] = a[i] - ‘0‘;
17         sum += b[i] * xishu[i];
18     }
19     sum %= 11;
20     a[17] = jieguo[sum];
21     for (i = 0; i < 18; i++)
22         printf("%c", a[i]);
23     printf("\n");
24     return 0;
25 }

太傻了。。。

原文地址:https://www.cnblogs.com/ZhengLijie/p/12580450.html

时间: 2024-07-30 21:09:50

算法训练:身份证号码升级的相关文章

算法提高 身份证号码升级

问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位身份证号码中的年份由2位(7,8位)改为四位. 2.最后添加一位验证码.验证码的计算方案: 将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2. 请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码.假设所

身份证号码升级

问题描述 从1999年10月1日开始,公民身份证号码由15位数字增至18位.(18位身份证号码简介).升级方法为: 1.把15位身份证号码中的年份由2位(7,8位)改为四位. 2.最后添加一位验证码.验证码的计算方案: 将前 17 位分别乘以对应系数 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 并相加,然后除以 11 取余数,0-10 分别对应 1 0 x 9 8 7 6 5 4 3 2. 请编写一个程序,用户输入15位身份证号码,程序生成18位身份证号码.假设所

算法训练 筛选号码

问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下一个人开始继续报数,直到剩下最后一个人,游戏结束. 问最后留下的是原来第几号的那位. 举个例子,8个人围成一圈: 1 2 3 4 5 6 7 8 第1次报数之后,3退出,剩下: 1 2 4 5 6 7 8 (现在从4开始报数) 第2次报数之后,6退出,剩下: 1 2 4 5 7 8 (现在从7开始报数) 第3次报数之后,1退出,剩下: 2 4 5 7 8 (现在从2开始报数) 第4

按GB 11643标准对大陆身份证号码分析验证

按照GB 11643标准进行身份证验证,然后GB/T 2260采用的是2013标准,因为实在无法找到GB/T 2260-84标准,所以实际会出现正确的身份证也无法识别的情况,这时候可以通过设置要验证的AreaLevel来降低验证级别,如果能找全所有GB/T 2260标准的话,代码也就能加入按生日判断该采用哪个标准的功能,下面是具体代码 相关枚举 /// <summary> /// 身份证号码长度 /// </summary> public enum CardLength { All

中国大陆新身份证号码算法

1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行.(所有区域的编码可以到这个网站http://www.stats.gov.cn/tjbz/index.htm查询到最新的县及县以上的行政编码资料.) 3.出生日期码 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月

身份证号码图像提取--基于canny边缘检测的连通域检测算法

在之前扫描二维码提取任务之后,工作中又需要将身份证图像中的身份证号码提取出来,然后给同事调用进行识别.之前的连通域检测算法比较"蛮力",因为它一旦检测出一个大的区域,那么这区域中的所有内部区域都将不复存在了.所以在连通域检测时,需要第一步去掉周围可能存在的白边,否则就会失败.后来笔者换了一个思路,如果检测一个区域时保存对应生成该区域的点,该区域不符合要求的话就将这些点擦掉,从而就不会影响到内部的区域了.于是就有了一下算法的诞生: (1)从左上角开始,从碰到的第一个白点开始探测最大的连通

身份证号码18个数字代表的意思

一.前言介绍 中华人民共和国公民身份号码是中华人民共和国为中国大陆每个公民从出生之日起编定的唯一的.终身不变的身份代码,在中华人民共和国公民办理涉及政治.经济.社会生活等权益事务方面广泛使用.中华人民共和国公安部负责公民身份号码的编制和组织实施工作. 1999年8月26日中华人民共和国国务院发布<国务院关于实行公民身份号码制度的决定>(国发[1999]15号),这个文件规定自1999年10月1日起在全国建立和实行公民身份号码制度. 二.数字组成方式 1.地址码(身份证号码前六位) 表示编码对象

身份证号码自动生成程序(Python)

今天收到一个小需求:需要一个自动生成身份证号码的小程序.近期用python较多,因此打算用python实现. 需求细化: 1.身份证必须能够通过身份证校验程序. 2.通过查询,发现身份证号码是有国家标准的,标准号为  GB 11643-1999  可以从百度下载到这个文档http://zhidao.baidu.com/share/b838c7683bb70af8166efd810a398fec.html 现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码.具体例子可见下图.

黄聪:jquery 校验中国身份证号码

大陆18位身份证(第二代身份证) 身份号码是一组具有特征组合码,由十七位数字本体码和一位校验码组成. 排列顺序从左至右依次为:六位数字地区码,八位数字生日码,三位数字顺序码和一位数字校验码. 校验方法: (1)先对前17位数字的权求和 S = Sum(Ci * Vi), i = 0, ... , 16 Ci:表示身份证号码上第i位置的数字值 Vi:表示第i位置上的“加权因子”        加权因子Vi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模(固定