NextDate问题

Input

输入是一个字符串,根据实际情况,一般一行输入不会太长,我们规定串的长度<=256。根据国家标准,合格的日期是
YYYYMMDD或者YYYY-MM-DD,我们还可以扩展一下,如果把公元前的年份为负数,那么-YYYYMMDD和-YYYY-MM-DD
也算为合格输入,同时规定此时输出加前缀“BC ”,为了使问题简化,特别是简化闰年的计算,我们规定年份的绝对值不超
过9999。本问题是多组测试数据。

Output

输出给定日期的向后一天或者“Error !”。输出时都按照“-”作为分隔符。

Sample Input

2015-03-31
12345678

Sample Output

2015-04-01
Error !
#include
using namespace std;
int d[15]={0,31,0,31,30,31,30,31,31,30,31,30,31};
const int MAXN=505;
char s[MAXN];
int MM,YY,DD;
bool is_leap(int x)
{
    return (x%4==0&&x%100!=0)||x%400==0;
}
bool isdate()
{
    if(YY==0)return false;
    if(YY>0)
    {
        d[2]=is_leap(YY)?29:28;
    }
    else
    {
        d[2]=is_leap(YY+1)?29:28;
    }
    if(MM<1||MM>12)return false;
    if(DD<1||DD>d[MM])return false;
    return true;
}
bool ck1(char *s)
{
    if(strlen(s)<8)return false;
    if(s[0]=='-')
    {
        if(s[1]!='-'&&ck1(s+1))
        {
            YY*=-1;
            return true;
        }
        return false;
    }
    if(strlen(s)!=8)return false;
    for(int i=0;i<8;++i)
    {
        if(s[i]>'9'||s[i]<'0')return false;
    }
    YY=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
    MM=(s[4]-'0')*10+(s[5]-'0');
    DD=(s[6]-'0')*10+(s[7]-'0');
    return true;
}
bool ck2(char *s)
{
    if(strlen(s)<10)return false;
    if(s[0]=='-')
    {
        if(s[1]!='-'&&ck2(s+1))
        {
            YY*=-1;
            return true;
        }
        return false;
    }
    if(strlen(s)!=10)return false;
    for(int i=0;i<10;++i)
    {
        if(i==4||i==7)
        {
            if(s[i]!='-')return false;
            continue;
        }
        if(s[i]>'9'||s[i]<'0')return false;
    }
    YY=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
    MM=(s[5]-'0')*10+(s[6]-'0');
    DD=(s[8]-'0')*10+(s[9]-'0');
    return true;
}
void go()
{
    if(YY>0)
    {
        d[2]=is_leap(YY)?29:28;
    }
    else
    {
        d[2]=is_leap(YY+1)?29:28;
    }
    ++DD;
    if(DD>d[MM])
    {
        ++MM;
        DD=1;
        if(MM>12)
        {
            ++YY;
            MM=1;
            if(YY==0)
            {
                ++YY;
            }
        }
    }
}
int main()
{
    while(scanf("%s",s)!=EOF)
    {
        if(ck1(s))
        {
            if(isdate())
            {
                go();
                assert(abs(YY<=9999));
                if(YY<0)
                {
                    printf("BC ");
                    YY=-YY;
                }
                printf("%04d-%02d-%02d\n",YY,MM,DD);
            }
            else
            {
                printf("Error !\n");
            }
        }
        else if(ck2(s))
        {
            if(isdate())
            {
                go();
                assert(abs(YY<=9999));
                if(YY<0)
                {
                    printf("BC ");
                    YY=-YY;
                }

                printf("%04d-%02d-%02d\n",YY,MM,DD);
            }
            else
            {
                printf("Error !\n");
            }
        }
        else
        {
            printf("Error !\n");
        }
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法)