考点:
- 平年是date.year%4==0&&date.year%100==0;否则是闰年
- 平年二月是28天,闰年是29天
技巧:
- 用结构体表示日期
struct Date
{
int year;
int month;
int day;
int count;
};
函数一:
/*计算天数*/
int caldays(Date date)
{
int result=date.day;
int runnian_days[]={31,29,31,30,31,30,31,31,30,31,30,31};
int pingnian_days[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(date.year%4==0&&date.year%100==0)
{
for(int i=0;i<date.month-1;i++)
{
result+=runnian_days[i];
}
}
else
{
for(int i=0;i<date.month-1;i++)
{
result+=pingnian_days[i];
}
}
return result;
}
函数二:
/*已知第几天,求日期*/
void caldate(Date &date)
{
int runnian_days[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int pingnian_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(date.year%4==0&&date.year%100==0)
{
for(int i=0;i<12;i++)
{
if(date.count-runnian_days[i]<runnian_days[i+1])
{
date.month=i+1;
date.day=date.count-runnian_days[i];
break;
}
}
}
}
例题:
方法是上面两个函数的结合体,首先通过给定的年月日计算出这一天是该年的第几天,然后将该天数加上给定的数值,最后对加上数值后的天数反向求解,得出月和日。
注意:有可能给定数值加上天数后超过了该年的天数,这时需要将年数更正为正确的年数后,才能继续按照之前的方式计算月和日。
#include<iostream>
#include<vector>
using namespace std;
struct Date
{
int year;
int month;
int day;
int gap;
};
int calgap(Date date)
{
int rundays[] = {0,31,29,31,30,31,31,30,31,30,31,30,31};
int pingdays[] = {0,31,28,31,30,31,31,30,31,30,31,30,31};
int gap;
if(date.year%4==0&&date.year%100==0)
{
gap=date.day;
for(int i=0;i<date.month;i++)
{
gap+=rundays[i];
}
}
else
{
gap=date.day;
for(int i=0;i<date.month;i++)
{
gap+=pingdays[i];
}
}
return gap;
}
Date caldate(Date date,int gap)
{
Date rdate;
int rundays[] = {31,29,31,30,31,31,30,31,30,31,30,31};
int pingdays[] = {31,28,31,30,31,31,30,31,30,31,30,31};
int year = date.year;
rdate.year = date.year;
if(date.year%4==0&&date.year%100==0)
{
int daylen=0;
for(int i=0;i<12;i++)
{
if((gap-daylen)<rundays[i])
{
cout<<daylen<<endl;
rdate.month=i+1;
rdate.day=gap-daylen;
break;
}
else
{
cout<<daylen<<endl;
daylen+=rundays[i];
}
}
}
else
{
int daylen=0;
for(int i=0;i<12;i++)
{
if((gap-daylen)<pingdays[i])
{
rdate.month=i+1;
rdate.day=gap-daylen;
break;
}
else
{
daylen+=pingdays[i];
}
}
}
return rdate;
}
bool judge_nextyear(Date &date,int &gap)
{//判断是否gap>该年天数
if(date.year%4==0&&date.year%100==0)
{
if(gap>366)
{
//如果gap>366,纠正year,gap
date.year=date.year+1;
gap=gap-366;
return true;
}
else return false;
}
else
{
if(gap>365)
{
date.year=date.year+1;
gap=gap-366;
return true;
}
else return false;
}
}
int main()
{
int m;
cin>>m;
int gaps[m];
vector<Date> dates;
for(int i=0;i<m;i++)
{
Date date;
cin>>date.year>>date.month>>date.day>>gaps[i];
dates.push_back(date);
date.gap = calgap(date);
cout<<"这是当年的第"<<date.gap<<"天"<<endl;
int gap = date.gap+gaps[i];
cout<<"要求的是第"<<gap<<"天"<<endl;
while(judge_nextyear(date,gap))
{
cout<<"需要下一年。"<<endl;
if((date.year+1)%4==0&&(date.year+1)%100==0)
{
cout<<"下一年是闰年。"<<endl;
if(gap-366>366)
{
//需要进入下下一年
date.year=date.year+1;
gap=gap-366;
}
else break;
}
else
{
cout<<"下一年是平年。"<<endl;
if(gap-365>365)
{
date.year=date.year+1;
gap=gap-365;
}
else break;
}
}
cout<<date.year<<gap<<endl;
Date rdate=caldate(date,gap);
cout<<rdate.year<<" "<<rdate.month<<" "<<rdate.day<<endl;
}
return 0;
}