题目描述:
输输入多个测试用例,每个测试用例为一日期,输出该日期是所在年的第几天。
输输入:
输入多个测试用例,每个测试用例为一日期,每个测试用例占一行。
输输出:
对每个测试用例输出该日期是所在年的第几天,每个输出占一行。
样样例输入
2021 1 29
样样例输出
29
原题链接:P1115 - 本年度第几天(函数实现) - HAUE-OJ (haueacm.top)
代码示例:
#include<iostream>
using namespace std;
int a[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}};
bool leap(int year)
{
return year%4==0&&year%100!=0||year%400==0;
}
int main()
{
int year,month,day,ans=0;
while(~scanf("%d %d %d",&year,&month,&day)){
for(int i=0;i<month;i++){
ans+=a[leap(year)][i];
}
ans+=day;
cout<<ans<<endl;
}
return 0;
}
代码分析:这段代码的巧妙之处在于使用了一个二维数组 a
来存储每个月的天数,而数组的索引通过 leap
函数来确定,该函数用于判断是否为闰年。以下是主要的巧妙之处:
-
数组
a
的巧妙使用:int a[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}};
- 通过数组
a
,将平年和闰年每个月的天数整合在一起,使得通过索引a[leap(year)][i]
就可以获得当前年份、月份的天数。这样避免了在代码中使用多个条件语句,使得代码更加简洁。
- 通过数组
-
leap
函数的巧妙设计:bool leap(int year) { return year%4==0&&year%100!=0||year%400==0; }
- 通过一行简短的表达式,判断是否为闰年。这个表达式涵盖了闰年的所有规则,包括能被4整除但不能被100整除,或者能被400整除。这种设计使得代码易读且高效。
-
累加天数的处理:
for(int i=0;i<month;i++){ ans+=a[leap(year)][i]; } ans+=day;
- 通过一个简单的
for
循环累加每个月的天数,再加上输入的日,就得到了该日期在该年的天数。这种方式很直观地体现了日期计算的逻辑。
- 通过一个简单的
总体来说,这段代码通过巧妙的数组设计和函数使用,实现了日期计算的功能,同时代码结构清晰简洁。有更好方法欢迎评论区留言