题目描述:
- 描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
- 输入描述:
输入一行,每行空格分割,分别是年,月,日
- 输出描述:
输出是这一年的第几天
解题关键点之一:闰年判断
//n为输入的年份
//闰年的判断规则:
//1.n%4 == 0 && n%100 != 0 || n&400 == 0;
//2.其它情况就为平年了
了解闰年与平年的区别:
- 闰年二月29天
- 平年二月28天
- 闰年总天数366天
- 平年总天数365天
除二月外,其它月份天数可划分为30天的月份和31天的月份:
- 30天:4、6、9、11
- 31天:1、3、5、7、8、10、12
本题的解题思路:
- 定义一个数组存储每个月天数,二月先存储28天,但该数组大大小为13,第一个元素需要存储0。
- 判断输入的年份是否是闰年,如果是,则修改数组中二月的天数为29。
- for循环将天数累加,如输入3月,则输入天数+=下标[],循环,直到累加到该月份。
为什么数组的大小为13呢?不是只有12个月吗?
因为已知要计算的月份和天数,因此其实是加上前一个月的天数后再加输入的天数。
比如:1月 20日,那计算的时候不能直接将1月的天数全部加上然后加20日,只能假设
1月前还有月份,20日+前一个月的天数,那就是这一年的第几天了。后面月份类似,输入天数+前一个月天数。
下面展示完整代码:
方法一:手动累加该月份前的总天数+输入天数
//输入日期,计算这一天为这一年的第几天
int main()
{
//输入年月日
int year = 0;
scanf("%d", &year);
int month = 0;
scanf("%d", &month);
int day = 0;
scanf("%d", &day);
//定义变量,用于累加天数
int sum = 0;
//判断年份为闰年还是平年
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
//利用Switch语句,判断输入的月份
//并将天数加起来
//输入的日期+前一个月的天数 = 这一年的第几天
switch (month)
{
case 1:
sum += day;
break;
case 2:
sum += day + 31;
break;
case 3:
sum += day + 60;
break;
case 4:
sum += day + 91;
break;
case 5:
sum += day + 121;
break;
case 6:
sum += day + 152;
break;
case 7:
sum += day + 182;
break;
case 8:
sum += day + 213;
break;
case 9:
sum += day + 244;
break;
case 10:
sum += day + 274;
break;
case 11:
sum += day + 305;
break;
case 12:
sum += day + 335;
break;
}
printf("%d月%d日是%d年的第%d天\n", month,day, year, sum);
}
//平年情况
else
{
//利用Switch语句,判断输入的月份
//并将天数加起来
//输入的日期+前一个月的天数 = 这一年的第几天
switch (month)
{
case 1:
sum += day;
break;
case 2:
sum += day + 31;
break;
case 3:
sum += day + 59;
break;
case 4:
sum += day + 90;
break;
case 5:
sum += day + 120;
break;
case 6:
sum += day + 151;
break;
case 7:
sum += day + 181;
break;
case 8:
sum += day + 212;
break;
case 9:
sum += day + 243;
break;
case 10:
sum += day + 273;
break;
case 11:
sum += day + 304;
break;
case 12:
sum += day + 334;
break;
}
printf("%d月%d日是%d年的第%d天\n", month,day, year, sum);
}
return 0;
}
方法二:for循环累加计算
#include <stdio.h>
int ComDayNum(int a, int b, int c, int* arr) {
if ((a % 4 == 0 && a % 100 != 0)
|| (a % 400 == 0)) {
//闰年
//2月29天
//一年366天
*(arr + 2) = 29;
}
//天数累加上前一个月的总天数
//如月份是1月,那天数+0,2月,天数+31。
for (int i = 0; i < b; i++) {
c += *(arr + i);
}
return c;
}
int main() {
int a, b, c;
//一年只有12个月,为什么数组的大小为13?
//因为已知要计算的月份和天数,因此其实是加上前一个月的天数后再加输入的天数。
//比如:1月 20日,那计算的时候不能直接将1月的天数全部加上然后加20日,只能假设
//从1月前还有月份,20日+前一个月的天数,那就是这一年的第几天了。
//后面月份类似,输入天数+前一个月天数。
int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (scanf("%d %d %d", &a, &b, &c) != EOF) {
int Sum = ComDayNum(a, b, c, arr);
printf("%d\n", Sum);
}
return 0;
}