保研机试备考四:日期问题
AcWing 3607. 打印日期
题目
https://www.acwing.com/problem/content/description/3610/
思路
分成闰年和非闰年的情况,把每个月的第一天的时间处理出来,先找到在哪个月,再减去那个月的起始天数算出具体是这个月的哪一天。
代码
#include<iostream>
using namespace std;
int daysr[12]={1,32,61,92,122,153,183,214,245,275,306,336};
int days[12]={1,32,60,91,121,152,182,213,244,274,305,335};
int y,d;
int month,day;
int main()
{
while(cin>>y>>d)
{
int i=0;
if((y%4==0&&y%100!=0)||(y%400==0)) //闰年
{
while(d>=daysr[i]&&i<12) i++;
i--;
month=i+1;
day=d-daysr[i]+1;
}
else //非闰年
{
while(d>=days[i]&&i<12) i++;
i--;
month=i+1;
day=d-days[i]+1;
}
printf("%04d-%02d-%02d\n",y,month,day);
} //c语言格式化输出,注意!!这样输出可以控制位数
return 0;
}
AcWing 3573. 日期累加
题目
https://www.acwing.com/problem/content/3576/
思路
首先先按年来枚举,不断往后跳一年,直到不能跳一整年为止
然后再按照天来枚举
对于闰年,要特判
代码
#include<iostream>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int y)
{
if((y%4==0&&y%100!=0)||(y%400==0))
return true;
else
return false;
}
int get_days(int y,int m)
{
if(m==2) return days[m]+is_leap(y);
else return days[m];
}
int get_yeardays(int y,int m)
{
if(m<=2) return 365+is_leap(y); //如果是二月份内,往后跳一年,那要看今年是不是闰年
else return 365+is_leap(y+1); //如果是二月份外,往后跳一年,那要看明年是不是闰年
}
int t;
int y,m,d,a;
int main()
{
cin>>t;
while(t--)
{
cin>>y>>m>>d>>a;
if(m==2&&d==29) a--,m=3,d=1; //特判闰年的2.29,因为它不好直接往后跳,都不一定有呢
while(a>get_yeardays(y,m)) //如果还可以往后跳一年,就继续跳,不能跳了,也即a<=get_yeardays(y,m)
{
a-=get_yeardays(y,m);
y++;
}
while(a--)
{
if(++d>get_days(y,m))
{
d=1;
m++;
if(m>12)
{
m=1;
y++;
}
}
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}