zoukankan      html  css  js  c++  java
  • 算法训练:身份证号码升级

    问题描述
      从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 }

    太傻了。。。

  • 相关阅读:
    利用pipe实现进程通信一例
    司机和售票员问题 信号signal注册一例
    HDU 1003
    HDU 1847
    HDU 1846(巴什博弈)
    《断弦》感想
    夺冠概率
    熄灯问题
    HDU 2176(Nim博弈)
    NYOJ 541
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12580450.html
Copyright © 2011-2022 走看看