如果输入数字满足两个形式,输出两个日期并将更早的一天优先显示并算出天数差。可以参照sample input
4个例子的运行结果:
代码如下:
#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啊