• 3272: 公民身份号码


    3272: 公民身份号码

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 85  Solved: 12
    [Submit][Status][Web Board]

    Description

    中华人民共和国居民身份证是国家法定的证明公民个人身份的有效证件。

    公民身份号码是特征组合码,由17位数字本体码和1位数字校验码组成。排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位数字校验码。

    8位数字出生日期码,即公民身份号码的第7位到第14位,表示该居民出生的年、月、日,其中年份用4位数字表示,月和日分别用2位数字表示,且年、月、日之间不用分隔符。例如:2018年06月09日就用20180609表示。

    3位数字顺序码中的最后一位,即公民身份号码的第17位,如果是奇数,表明该居民是男性;如果是偶数,表明该居民是女性。

    最后1位数字校验码,即公民身份号码的第18位,计算方法如下:

    (1)将前面的17位身份证号码分别乘以不同的系数。从第1位到第17位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;

    (2)将这17位数字和系数相乘之后的结果相加,再除以11;

    (3)余数只可能是0、1、2、3、4、5、6、7、8、9、10这11个数字之一。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。(即余数0对应1,余数1对应0,余数2对应X...)

    给出一些不确定是否正确的18位公民身份号码,请你计算最后1位数字校验码是否正确。如果正确,输出公民身份号码对应居民的出生日期和性别;如果不正确,输出居民正确的公民身份号码(18位)、出生日期和性别。

     

    Input

    第一行输入测试数据的数目n;

    第二行到第n+1行,每行输入一个不确定是否正确的18位公民身份号码。

    Output

    按照题意输出,个人信息之间用单个空格分隔开。

    Sample Input

    2
    370613199901101327
    370613199810012450
    

    Sample Output

    1999-1-10 female
    37061319981001245X 1998-10-1 male

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main()
    {
        int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};
        int n,d[20],e,sum;
        char a[20];
        scanf("%d",&n);
        while(n--)
        {
            int i,len;
            sum=0;
            scanf("%s",a);
            len=strlen(a);
            for(i=0;i<len;i++)
                d[i]=a[i]-'0';
            //for(i=0;i<len;i++)
               // printf("%d",d[i]);
            //printf("
    ");
            for(i=0;i<len-1;i++)
                sum=sum+d[i]*b[i];
            e=sum%11;
            //printf("%d",e);
            if(c[e]==a[17])
            {
                for(i=6;i<=9;i++)
                    printf("%c",a[i]);
                if(a[10]=='0')
                    printf("-%c",a[11]);
                else printf("-%c%c",a[10],a[11]);
                if(a[12]=='0')
                    printf("-%c ",a[13]);
                else printf("-%c%c ",a[12],a[13]);
                if(d[16]%2==0)
                    printf("female
    ");
                else
                    printf("male
    ");
            }
            else
            {
                for(i=0;i<len;i++)
                {
                    if(i==len-1)
                        printf("%c",c[e]);
                    else
                        printf("%c",a[i]);
                }
                printf(" ");
                for(i=6;i<=9;i++)
                    printf("%c",a[i]);
                if(a[10]=='0')
                    printf("-%c",a[11]);
                else printf("-%c%c",a[10],a[11]);
                if(a[12]=='0')
                    printf("-%c ",a[13]);
                else printf("-%c%c ",a[12],a[13]);
                if(d[16]%2==0)
                    printf("female
    ");
                else
                    printf("male
    ");
    
            }
    
        }
    }
    

      

  • 相关阅读:
    POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
    HDU 5992 kd-tree
    BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找
    BZOJ 4066 kd-tree 矩形询问求和
    BZOJ 1941 kd-tree
    BZOJ 2648 kd-tree模板
    HDU 5925 离散化
    php trait
    php命名空间
    js
  • 原文地址:https://www.cnblogs.com/mjn1/p/9164008.html
Copyright © 2020-2023  润新知