我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。
鉴于我的解法和我同学(ss)的解法相类似(看了大佬的代码之后恍然大悟),我就打算将我们的思路整合,写下我们的思路。
算法思路如下:
大前提是根据是否是闰年,创建一个数组,存放每个月的日期,方便后续的日期调整;
其次对于进月和进年,需要细分数据的计数零点,从零月开始还是一月开始;
最后就是数据的最终调整和输出。
判断是否是闰年的方法在之前的文章里面也出现过,这里就不细说:
bool iffrun(int n)
{
if((n%4==0&&n%100!=0)||n%400==0)
{
return true;
}
return false;
}
算法主体如下:
优先考虑对月份的进位,先对日进行重置,将多出来的天数加到预加的天数中:
这里创建一个数组来存放年月日,n存放预加的天数。
int a[3],n;
scanf("%d%d%d%d",a,a+1,a+2,&n);
n+=a[2]-1;
a[2]=1;
对于闰年和平年每个月的日期,这里创建两个数组分别存储,调用时直接访问数组下标:
int q1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int q2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
在符合条件的情况下调整年和月,这里之所以可以直接调整到日输出,与先前预先重置日相关:
while(1)
{
if(!iffrun(a[0])) // 平年
{
for(;a[1]<13;a[1]++)
{
if(n-q1[a[1]]>=0) // 大于一个月,调整剩下的天数
{
n-=q1[a[1]];
}
else // 剩下的日子不足一个月,直接加到日输出
{
a[2]=a[2]+n;
printf("%d.%d.%d\n",a[0],a[1],a[2]);
return 0;
}
}
a[1]=0;
}
else // 闰年
{
for(;a[1]<13;a[1]++)
{
if(n-q2[a[1]]>=0)
{
n-=q2[a[1]];
}
else
{
a[2]=a[2]+n;
printf("%d.%d.%d\n",a[0],a[1],a[2]);
return 0;
}
}
a[1]=0; // 由于每次进循环总要进for循环调整月,所以这里从0开始计数
}
a[0]++; // 月份大于12,年进一
}
总结:
本题中规中矩,是没太多需要排雷的点的题目