记住闰年的二月是29天,曾经在这里摔过
/*
需要注意的有①、②、③、④三点。
*/
#include <cstdio>
int Month[]={0,31,59,90,120,151,181,212,243,273,304,334,365};//③
struct Date
{
int year;
int month;
int day;
Date(int year,int month,int day):year(year),month(month),day(day){}
Date(){}
};
bool isLeap(int year)//判断是否为闰年
{
if((year%4==0 && year%100!=0) || year%400==0)
return 1;
return 0;
}
bool isLegal(Date date)//日期是否合法
{
if(date.month<1 || date.month>12)
return false;
else if(date.month==2 && isLeap(date.year))
return date.day<=29 && date.day>0;
else return
date.day<=Month[date.month]-Month[date.month-1] && date.day>0;
}
int getDays(Date date)//日期转换为天数
{
int num=365*date.year+((date.year-1)/4-(date.year-1)/100+(date.year-1)/400);
//④,从第0年到第year年,其中共包含year个完整的年,因为第year年还没有过完,所以闰年的计算只能从year - 1开始
num+=Month[date.month-1];
if(isLeap(date.year) && date.month>2)
num++;
num+=date.day;
if(date.year>0)
num++;//①因为在处理的时候,第一年(0年)是闰年,而并没有记入到计算中去,这里进行处理是为了方便getDate的正确,否则始终少1
return num;
}
Date getDate(int days)//天数转换成日期
{
int i;
Date date;
date.year=400*(days/146097);//②,这里400年一个周期
days=days%146097;
for(;days>365+isLeap(date.year);)
{
days-=365+isLeap(date.year);
date.year++;
}
for(i=1;days>Month[i]-Month[i-1]+(i==2 && isLeap(date.year));i++)
{
days-=Month[i]-Month[i-1]+(i==2 && isLeap(date.year));
}
date.month=i;
date.day=days;
return date;
}
int getWeek(Date date1,Date date2,int week)//返回指定日期是星期几
{
int days1=getDays(date1);
int days2=getDays(date2);
return (week+days1-days2)%7+1;
}
int main()
{
int year,month,day;
while(scanf("%d%d%d",&year,&month,&day)==3)
{
Date date1=Date(year,month,day);
if(!isLegal(date1))
{
printf("error!\n");
continue;
}
int n=getDays(date1);
printf("%d\n",n);
Date date2;
date2=getDate(n);
printf("%d:%d:%d\n",date2.year,date2.month,date2.day);
}
return 0;
}