描述 根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶:时间复杂度:O(n) ,空间复杂度:O(1) 输入描述: 输入一行,每行空格分割,分别是年,月,日
输出描述: 输出是这一年的第几天 示例1 输入: 2012 12 31
输出: 366
示例2 输入: 1982 3 4
输出: 63
要求出日期在当前年份的第几天,首先我们要知道月份有大小月之分,年份也有平年和闰年的区分,我们需要根据输入的数据去判断然后求和。 知识点:闰年规则-维基百科 閏年是指該年有366日,即較平常年份多出一日 目前使用的格里高利曆闰年规则如下(这里的公元为公元后年份,公元前置润规则参见后续章节)[1]:
計算格里高利曆年份是平年還是閏年 1、公元年分非4的倍數,為平年。 2、公元年分為4的倍數但非100的倍數,为闰年。 3、公元年分為100的倍數但非400的倍數,为平年。 4、公元年分為400的倍數為閏年。 每逢閏年,2月份有29日,平年的2月份為28日。
因此,1979年、2018年、2021年為平年,1980年、2020年逢4的倍数為閏年,1900年逢100的倍数但非400的倍數故為平年。2000年逢400的倍数又為閏年。 因此,需要根据输入年份判断当前日期是否为闰年还是平年,若为闰年,则2月份有29天,否则为平年则2月份只有28天; 其次,当月份大于2时需要判断当前年份是平年还是闰年,若为闰年则2月份需要加上29天,否则2月份加上28天。 可以用一个数组保存12个月的天数,1,3,5,7,8,10,12月有31天,4,6,9,11有30天,2月份则比较特殊,闰年有29天,平年有28天。
#include <iostream>
using namespace std;
bool isLeapYear(int year)
{
if((year%400==0||(year%4==0&&year%100!=0))) {
return true;
}
return false;
}
int main()
{
int year,month,day;
// 每个月的天数,[1,3,5,7,8,10,12]月为31天,2月份可能为28(平年)或29天(闰年),[4,6,9,11]为30天
int daysOfMonth[]={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while(cin >> year >> month >> day)
{
int sum = 0;
for(int i = 0; i< month-1; i++)
{
sum=sum+daysOfMonth[i];
}
// 如果是闰年并且月份大于2,则在sum基础上多加1,再加上日数
if(isLeapYear(year) && month>2) {
sum=sum+1+day;
} else {
sum=sum+day;
}
cout<<sum<<endl;
}
return 0;
}