【描述】众所周知,日期有两种表示方法: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;
}
日期判断和转换
运行结果:
代码:
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!