3272: 公民身份号码

Posted mjn1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");

        }

    }
}

  





以上是关于3272: 公民身份号码的主要内容,如果未能解决你的问题,请参考以下文章

js验证身份证号码是否合规

csv文件导入SQL后就成这样了,怎么去掉等于号和双引号呢?

测试身份证号码

身份证号码校验解释

怎么检测身份证号码是不是正确?

身份证号码的正则表达式及验证详解(JavaScript,Regex)