算法训练:身份证号码升级
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××年
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 }
太傻了。。。
以上是关于算法训练:身份证号码升级的主要内容,如果未能解决你的问题,请参考以下文章