目录
一、题目描述
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度: O(n) ,空间复杂度: O(1)
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
示例:
输入:2012 12 31 输出:366 | 输入:1982 3 4 输出:63 |
二、解题思路
这道题简单解法其实将每个月的天数枚举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的天数。最终考虑平闰年的 2 月份区别是否增加一天。
其中需要注意的是平年和闰年的判断,而且是闰年的月份大于 2 的时候,也就是 2 月走完,总天数才能加 1 (比如 2000年2月18日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的).
三、运行代码
各位C友请看下面代码:
这道题各位只需要注意上面第二大点的解题思路,同时了解闰年的定义标准即可,其他需要注意的地方在代码里面都有注释
#include <stdio.h>
int is_leap_year(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 1;
}
return 0;
}
int main()
{
int month_day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year, month, day;
while (~scanf("%d %d %d", &year, &month, &day))
{
int total_day = day;//先把当前月份天数加上
if (is_leap_year(year) && month > 2)
{ //若闰年,且月份大于2月,则在平年基础上+1
total_day += 1;
}
for (int i = month - 1; i > 0; i--)
{
total_day += month_day[i];//向前累加每月的天数即可
}
printf("%d\n", total_day);
}
return 0;
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!