问题标题: 酷町堂:合法日期

0
0
已解决
王旭杰
王旭杰
高级光能
高级光能

合法日期经验值:0

题目描述 Description

身份证造假是违法行为。有些粗心的诈骗犯在造假身份证的时候连日期都写不对。现在请你编写一个程序,输入一个身份证号,请你判断身份证号中的日期是否合法。
身份证号是一个字符串长度为18位,其中第7~14位为出生日期(如1998年9月30日为19980930,最后一位可能是X,其他位均是数字。
请你判断身份证上的日期是否合法(日期真实存在),如果合法,输出YES,否则,输出NO。

输入描述 Input Description

一个字符串,代表身份证号

输出描述 Output Description

如题所述

样例输入 Sample Input

211381197613088853

样例输出 Sample Output

NO

数据范围及提示 Data Size & Hint

字符串的长度为18位。
样例中日期是19761308,月份不可能有13月,所以不合法。
平年1~12月的天数分别为31,28,31,30,31,30,31,31,30,31,30,31,闰年2月份天数29天。
所有年份(0000~9999)都认为是合法的。
年份是4的倍数但不是100的倍数,或者年份是400的倍数,即为闰年。

 

 

 

 

我的RE50

#include<iostream>
#include<cstdio>
using namespace std;
string s;
int days[13]={31,28,31,30,31,30,31,31,30,31,30,31};
int f(string t){
    int sum;
    int a;
    for(int i=0;i<=t.length()-1;i++){
        a=t[i]-'0';
        sum=sum*10+a;
    }
    return sum;
}
string check(int x,int y,int z){
    bool flag=0;
    if(!(x>=0&&x<=9999))flag=1;
    if(!(y<=12))flag=1;
    if(!(z>=0&&z<=days[y]))flag=1;
    if(flag)return "NO";
    return "YES";
}
int main() {
    getline(cin,s);
    string a=s.substr(7,4);
    string b=s.substr(11,2);
    string c=s.substr(13,2);
    int x=f(a);   
    int y=f(b);   
    int z=f(c);
    if(y==2)if(x%4==0&&x%100!=0||x%400==0)days[2]++;
    cout<<check(x,y,z);   
    return 0;
}

王旭杰在2022-10-07 21:00:22追加了内容

60

 

 

#include<iostream>

#include<cstdio>

using namespace std;

string s;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int f(string t){

    int sum;

    int a;

    for(int i=0;i<=t.length()-1;i++){

        a=t[i]-'0';

        sum=sum*10+a;

    }

    return sum;

}

string check(int x,int y,int z){

    bool flag=0;

    if(!(x>=0&&x<=9999))flag=1;

    if(!(y<=12&&y>=0))flag=1;

    if(!(z>=0&&z<=days[y]))flag=1;

    if(flag)return "NO";

    return "YES";

}

int main() {

    getline(cin,s);

    string a=s.substr(7,4);

    string b=s.substr(11,2);

    string c=s.substr(13,2);

    int x=f(a);

    int y=f(b);

    int z=f(c);

    if(y==2)if(x%4==0&&x%100!=0||x%400==0)days[2]++;

    cout<<check(x,y,z);

    return 0;

}


0
0
0
熊潇然
熊潇然
初级启示者
初级启示者

你在判断z<=days[y]的时候y有可能>12

还有你days最好days[0]=0,1=31,2=28......

0
0
0
0
我要回答