内存:128  时间:1

题目描述

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

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

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

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

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

1)将前面的17位身份证号码分别乘以不同的系数。从第1位到第17位的系数分别为:7910584216379105842

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

3)余数只可能是01234567891011个数字之一。其分别对应的最后一位身份证的号码为10X98765432(即余数0对应1,余数1对应0,余数2对应X…)

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

输入

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

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

输出

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

样例输入

2
370613199901101327
370613199810012450

样例输出

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

提示

代码如下

#include<bits/stdc++.h>
using namespace std;
int w[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char e[11]= {'1','0','X','9','8','7','6','5','4','3','2'};
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        int len=s.length(),sex,a[20];
        int year=0,month=0,m=0,day=0,temp=1000;
        memset(a,0,sizeof(a));
        for(int i=0; i<len-1; ++i)
        {
            a[i]=int(s[i]-'0');
            m+=(a[i]*w[i]);
            if(i>=6&&i<=9)
            {
                year+=(temp*a[i]);
                temp/=10;
            }
            else if(i==10)
                month+=(10*a[i]);
            else if(i==11)
                month+=a[i];
            else if(i==12)
                day+=(10*a[i]);
            else if(i==13)
                day+=a[i];
            else if(i==16)
                sex=a[i];
        }
        char valid=e[m%11];
        if(s[len-1]!=valid)
        {
            for(int i=0; i<len-1; ++i)
                cout<<s[i];
            cout<<valid<<" ";
        }
        cout<<year<<"-"<<month<<"-"<<day<<" ";
        if(sex%2)
            cout<<"male"<<endl;
        else
            cout<<"female"<<endl;
    }
    return 0;
}

代码来源于互联网,仅供参考!