明确解题思想:
日期的变化要考虑到:1)这个年是平年还是闰年(平年2月28天,闰年2月29天)
2)每一个月的天数是28、29、30还是31
代码思路阐述:
1:把给定的当前月天数给到累加天数里,循环去减调每个月天数,月++,过了一年则年++
2、每一个月多少天直接以数组形式给出,因为数量不是特别大
3、考虑到如果最后正好卡到了某个月的0号,那要返回上一个月的最后一天
作者:Ansharly
链接:https://www.nowcoder.com/discuss/376063683691126784
来源:牛客网
//判断当前年份是平年还是闰年
bool isleapyear(int year)
{
if(year%4==0&&year%100!=0 || year%400==0)
return true;
else return false;
}
//每个月有几天的数组
//isleapyear返回true即是第1行,返回false即是第0行
//把第一列设置为0的原因是数组下标从0开始,如果是传进来的月份那么这个月份还需要+1;直接把第一列给为0就没问题了
int dayofeachmonth[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
int m;
int year,month,day,n;
cin>>m;
//m表示会输出的行数
while(m--)
{
cin>>year>>month>>day>>n;
n+=day;
day = 0;
while(n>=dayofeachmonth[isleapyear(year)][month])
{
n-=dayofeachmonth[isleapyear(year)][month];
if(month == 12)
{
month = 1;year++;
}
else
{
month++;
}
}
day+=n;
//避免得到的日期是某个月的第0天,这种情况就返回上一个月的最后一天就可以
if(day == 0)
{
month--;
day=dayofeachmonth[isleapyear(year)][month];
}
//cout<<year<<"-"<<month<<"-"<<day<<endl;
printf("%04d-%02d-%02d\n", year,month, day);
}
return 0;
}
思路清晰了你也来试试吧~
KY222-打印日期
打印日期
思路:和上面这道题目差不多,1、明确年份是否是闰年以及每个月的天数
2、month初始化为0,每将天数减一个月,month++,最后将不足一个月的天数赋值给day输出即可
#include <iostream>
using namespace std;
bool isleapyear(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else return false;
}
int days[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31} };
int main()
{
int year, n;
int day = 0;
while (cin >> year >> n)
{
int month = 0;
while (n > days[isleapyear(year)][month])
{
n -= days[isleapyear(year)][month];
if (month == 12)
{
month = 1; year++;
}
month++;
}
day = n;//不可以写成day+=n这样会导致下一次循环时都会在这个基础上再进行++,因为未脱离函数,资源未被释放
printf("%04d-%02d-%02d\n", year, month, day);
}
return 0;
}
思路清晰了你也快去试一试吧~