求这个问题的完整代码

【描述】众所周知,日期有两种表示方法:MM/DD/YY或者YY/MM/DD.我们假设本题讨论的年份的格式都是20YY。

给你一个字符串,如果它只能代表一个合法的日期,满足MM/DD/YY的格式或者是YY/MM/DD的格式,那么输出 “month date,year”的格式(见第二个样例),否则输出在这两种表示法下的日期差(见第一个样例)。

提示1:一年有12个月,分别是January, February, March, April, May, June, July, August, September, October, November 和 December。

提示2:注意闰年2月份有29天。闰年需要满足以下两个条件之一:

年份是400的倍数。
年份是4的倍数但年份不是100的倍数。
【输入】
一个时间字符串,格式为AA/BB/CC。保证AA/BB/CC至少满足两种表示法其中之一。

【输出】
见描述。

样例
输入

02/07/19
19/02/07
输出

6047
February 7, 2019
提示
样例1:02/07/19可能是2019.2.7(采用MM/DD/YY表示法)或者是2002.7.19(采用YY/MM/DD表示法)。这两个日期相差6047天。

样例2:19/02/07只能是2019.2.7(YY/MM/DD表示法)。也就是只能代表这一个日期,按照要求输出即可。

#include <stdio.h>
#include <math.h>
char month[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" ,"December"};
int m_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

int isleap(int year)
{
    if(year %400 == 0 || (year % 4== 0 && year %100 !=0))
        return 1;
    return 0;
}

int getdays(int year,int month,int day)
{
    int days = 0;
    for(int i=0;i<year;i++)
        if(isleap(i+2000))
            days += 366;
        else
            days += 365;
    for(int i=0;i<month-1;i++)
        days += m_days[i];
    if(month > 2 && isleap(year))
        days++;
    days += day;
    return days;
}

int isVal(int m,int d,int y)
{
    if(m>12 || m<1)
        return 0;
    if(d>31 || d<1)
        return 0;
    if(m==2 && d==29 && !isleap(y+2000))
        return 0;
    return 1;
}

int main()
{
    int a,b,c;
    scanf("%d/%d/%d",&a,&b,&c);
    if(isVal(a,b,c) && isVal(b,c,a))  //如果满足两种格式,输出时间差
        printf("%d",abs(getdays(a,b,c) - getdays(c,a,b)));
    else if(isVal(a,b,c))
        printf("%s %d,%d",month[a-1],b,c+2000);
    else
        printf("%s %d,%d",month[b-1],c,a+2000);
    return 0;

}

日期判断和转换
运行结果:

img

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//判断闰年
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[][10] = { "January","February","March","April","May","June","July","August","September","October","November","December" };
    printf("%s %d,%d", mon_en[m - 1], d, y);
}

int main()
{
    char str[10] = { 0 };
    int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    int month, year, day;
    int y1, m1,d1, y2, m2,d2;
    int f1 = 0, f2 = 0; //合法标记
    scanf("%s",str); //输入日期
    year = (str[0] - '0') * 10 + str[1] - '0';
    month = (str[3] - '0') * 10 + str[4] - '0';
    day = (str[6] - '0') * 10 + str[7] - '0';

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

    //判断mmddyy是否合法
    y2 = 2000 + day;
    d2 = month;
    m2 = year;
    if (leapyear(y2))
        days[2] = 29;
    else
        days[2] = 28;
    if (m2>0 && m2<=12 && d2 <= days[m2])
        f2 = 1;//合法
    else
        f2 = 0; //不合法
    if (f1 == 0 && f2 == 0) //都不合法
        printf("%s is not a valid date.",str);
    else if (f1 == 1 && f2 == 0) //f1合法
    {
        showdate(y1, m1, d1);//输出第1个日期
    }
    else if (f1 == 0 && f2 == 1)//f2合法
    {
        //输出第二个日期
        showdate(y2, m2, d2);
    }
    else
    {
        //两个日期都合法
        int st = isbig(y1, m1, d1, y2, m2, d2);
        if (st == 1)
        {
            printf("%d", dif(y1, m1, d1, y2, m2, d2));
        }
        else if (st == 0)
        {
            showdate(y1, m1, d1);//两个日期一样,输出第一个日期
        }
        else
        {
            printf("%d", dif(y2, m2, d2, y1, m1, d1));
        }
    }
    return 0;
}

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