1. 程式人生 > >HDU 17新生賽 身份證驗證【模擬】

HDU 17新生賽 身份證驗證【模擬】

scan n) code () int spl 自己 bug itl

身份證驗證

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1611 Accepted Submission(s): 201


Problem Description 大學時代的小Q,是一個誌向遠大的熱血青年,欲致力於國家網絡建設。長年泡在電腦密集的地區潛心鉆研以互聯網為傳輸媒介,以個人計算機為終端,旨在實現休閑、交流、獲得虛擬成就的多人在線遊戲。

畢業後,小Q實現了自己的夢想,成功當上了一名光榮的網管。

眾所周知,進網吧是要刷身份證的,現在老板讓他寫一個程序,判斷進來的人是否夠18周歲(當天恰好是18歲生日也可),並且根據身份證最後一位來校驗身份證真偽。

身份證號碼共有18位,從左至右編號,第7至第14位為生日,格式為YYYYMMDD,代表年月日。最有一位為校驗位,計算規則如下:

1. 將前面的身份證號碼17位數分別乘以不同的系數。從第1位到第17位的系數分別為:7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2。

2. 將這17位數字和系數相乘的結果相加。

3. 用得到的結果除以11,余數為0~10時對應的最後一位為:1,0,X,9,8,7,6,5,4,3,2。

請判斷給定的身份證號,如果號碼合法且持有人年滿18輸出“Accepted”,否則輸出“Sorry”(均不含引號)。

Input 輸入包含多組測試數據。

每組輸入數據第一行是一個正整數n(n<=1000);

第二行3個“-”號隔開的正整數YYYY-MM-DD,代表今天的日期;

接下來n行每行一組身份證編碼,每組編碼18位。

Output 每組數據輸出n行,每行為“Accepted”或“Sorry”(不含引號)。

Sample Input 3 2033-02-18 281289202506052608 696815200904169385 980189199511146901

Sample Output Sorry Accepted Sorry Hint
提示:第一個人不滿18歲,第三個人身份證號不合法。 【分析】:內部置0寫到外部,後果就是調bug調到死。 【代碼】: 技術分享圖片
#include <bits/stdc++.h>

using namespace std;
typedef  long long ll;
const int N = 100005;

int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char b[11] = { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };
char s[100];

int main()
{
    int n,j;
    int f1,f2;
    int y,m,d,sum,age;

    while(cin>>n)
    {
        scanf("%d-%d-%d",&y,&m,&d);
    for(int i=0;i<n;i++)
    {
        int yy=0,mm=0,dd=0;//註意內部清零!!!而非外部!!!
        char p[9] = {""};
        char p2[3] = {""};
        char p3[3] = {""};
        f1=f2==0;
        sum=0;
        scanf("%s",s);
        for(j=0;j<17;j++)//最後位檢驗
        {
            sum+=((s[j]-0)*a[j]);
        }
        sum=sum%11;//4

        if(s[17]==b[sum]) f1=1;
        //printf("sum=%d s[17]=%d b[sum]=%d\n",sum,s[17],b[sum]);//

        strncpy(p, s+6, 4);
        for(int i=0;p[i];i++)
        {
            yy=10*yy+(p[i]-0);
        }
        //printf("%d\n",yy);//2025
        strncpy(p2, s+10, 2);
        for(int i=0;p2[i];i++)
        {
            mm=10*mm+(p2[i]-0);
        }
        //printf("%d\n",mm);//6
        strncpy(p3, s+12, 2);
        for(int i=0;p3[i];i++)
        {
            dd=10*dd+(p3[i]-0);
        }
        //printf("%d\n",dd);//5
        
        age=y-yy;//歲數合法判斷
        //printf("%d\n",age);//2033-2025=8
        if(age>0)
        {
            if(age<18)
            {
                f2=0;
            }
            else if(age==18)
            {
                if(m<mm) f2=0;
                else if(m==mm)
                {
                    if(d<dd) f2=0;
                    else f2=1;
                }
                else f2=1;
            }
            else
            {
                f2=1;
            }
        }
        else
        {
            f2=0;
        }

        //printf("%d %d %d\n",f1,f2,sum);//

        if(f1==1 && f2==1) puts("Accepted");
        else  puts("Sorry");
    }
    }
    return 0;
}
模擬

HDU 17新生賽 身份證驗證【模擬】