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

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法训练:身份证号码升级相关的知识,希望对你有一定的参考价值。

问题描述
  从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("
");
24     return 0;
25 }

太傻了。。。

 

 

 

以上是关于算法训练:身份证号码升级的主要内容,如果未能解决你的问题,请参考以下文章

算法提高 身份证号码升级

身份证号码升级

15身份证号码转18位算法,用java 程序怎样实现即java程序源代码?

身份证号码的正则校验+升级版

将身份证的15位号码升级为18位

软工作业PSP与单元测试训练