输入六位数字,可以是日月年也可以是年月日

如果输入数字满足两个形式,输出两个日期并将更早的一天优先显示并算出天数差。可以参照sample input

img

img

img

img

4个例子的运行结果:

img

img

img

img

代码如下:

#include <iostream>
#include <iomanip>
using namespace std;
//判断闰年
int leapyear(int y)
{
    if(y%4==0 && y%100!=0 || y%400==0)
        return 1;
    else
        return 0;
}
//判断两个日期大小,前者大输出1,后者大输出-1,相等输出0
int isbig(int y1,int m1,int d1,int y2,int m2,int d2)
{
    if(y1>y2)
        return 1;
    else if(y1==y2)
    {
        if(m1>m2)
            return 1;
        else if(m1==m2)
        {
            if(d1>d2)
                return 1;
            else if(d1 == d2)
                return 0; //两个日期相等
        }
    }
    return -1;
}

//计算两个日期的间隔,默认前者大
int dif(int y1,int m1,int d1,int y2,int m2,int d2 )
{
    int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int t1=0,t2=0;
    //计算距y1-m1-d1离y2-01-01的天数
    for(int i=y2;i<y1;i++)
    {
        if(leapyear(i))
            t1 += 366;
        else
            t1 += 365;
    }
    if(leapyear(y1))
        days[2] = 29;
    else
        days[2] = 28;
    for(int i=1;i<m1;i++)
        t1 += days[i];
    t1 += d1;

    //计算y2-m2-d2距离y2-01-01的天数
    if(leapyear(y2))
        days[2] = 29;
    else
        days[2] = 28;
    for(int i=1;i<m2;i++)
        t2 += days[i];
    t2 += d2;

    return (t1-t2);
}


void showdate(int y,int m,int d)
{
    char mon_en[][6]={"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEPT","OCT","NOV","DEC"};
    cout << setw(2) << setfill('0')<< d <<"-" << mon_en[m-1] <<"-" <<y;
}


int main()
{
    char str[7]={0};
    int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    int month,year,day;
    int y1,d1,y2,d2;
    int f1 = 0,f2 =0; //合法标记
    cin >> str; //输入6位数字
    
    year = (str[0]-'0')*10 + str[1]-'0';
    month = (str[2]-'0')*10 + str[3]-'0';

    day =(str[4]-'0')*10+str[5]-'0';


    if(month >12)
    {
        cout << str <<" is not a valid date.";
        return 0;
    }

    //1.先按照yymmdd判断是否合法
    if(year<= 31)
        y1 = 2000 + year;
    else
        y1 = 1900+year;
    
    d1 = day;
    if(leapyear(y1))
        days[2] = 29;
    else
        days[2] = 28;
    //判断日期是否合法
    if(d1 <= days[month])
        f1 = 1;
    else
        f1 = 0; //不合法


    //判断ddmmyy是否合法
    if(day <=31)
        y2 = 2000 + day;
    else
        y2 = 1900 + day;

    d2 = year;
    if(leapyear(y2))
        days[2] = 29;
    else
        days[2] = 28;

    if(d2 <= days[month])
        f2 = 1;//合法
    else
        f2 = 0; //不合法

    if(f1==0 && f2 ==0) //都不合法
        cout << str <<" is not a valid date.";
    else if(f1 ==1 && f2 == 0) //f1合法
    {
        cout <<str <<" should be ";//<<d1<<"-"<<mon_en[month-1]<<"-"<<y1<< endl;//输出第一个日期
        showdate(y1,month,d1);
        cout << endl;
    }
    else if(f1==0  && f2 ==1)//f2合法
    {
        cout <<str <<" should be ";//<<d2<<"-"<<mon_en[month-1]<<"-"<<y2<< endl; //输出第二个日期
        showdate(y2,month,d2);
        cout << endl;
    }
    else
    {
        //两个日期都合法
        int st = isbig(y1,month,d1,y2,month,d2);
        if(st == 1)
        {
            cout << str <<" could be " ;
            showdate(y2,month,d2);
            cout << " or ";
            showdate(y1,month,d1);
            cout << endl;
            cout <<"#########################################################"<<endl;
            cout <<"# The ambiguity causes a time difference of "<< dif(y1,month,d1,y2,month,d2)<<" days! #"<<endl;
            cout <<"#########################################################"<<endl;
        }else if(st == 0)
        {
            cout <<str <<" should be ";//两个日期一样,输出第一个日期
            showdate(y1,month,d1);
            cout << endl;
        }else
        {
            cout << str <<" could be " ;
            showdate(y1,month,d1);
            cout <<" or ";
            showdate(y2,month,d2);
            cout << endl;
            
            cout <<"#########################################################"<<endl;
            cout <<"# The ambiguity causes a time difference of "<< dif(y2,month,d2,y1,month,d1)<<" days! #"<<endl;
            cout <<"#########################################################"<<endl;
        }
    }
    return 0;
}

为何121314是无效日期呢?111213却是有效日期?
121314可以是2014年12月13啊

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^