题目难度:一星
考察点:模拟

方法:模拟

1.分析:

我们根据题意很容易想到,其实我们只要先列举出每个月有多少天,然后求除了当前月份,前个月的天数之和加上当前输入的天数加和输出即可,需要注意的是要判断当前输入的年是不是闰年,如果是闰年的话二月就会有29天。首先预处理mon 数组,其中mon[i]表示第i个月有mon[i]天,其中mon[2]=28。即如果输入的是y, m, d 的话,首先判断当前y是不是闰年,然后计算前m-1个月份的mon[i]之和,如果y是闰年同时m>2的话,ans=ans+1,然后在加上当前的d,输出ans即可。
算法实现:
(1). 输入年月日y, m, d;
(2). 预处理mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
(3). 写一个判断当前年是不是闰年的函数
(4). i从1遍历到m-1,ans加上说有的mon[i],然后如果当前m>2且y是闰年的话,ans++,然后在加上当前的d。
(5). 输出ans即可。

2.复杂度分析:

时间复杂度:O(1)
空间复杂度:O(1)

3.代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeap(int year) {
    return (year%4==0 && year%100!=0 || year%400==0);
}
int get_day(int y, int m, int d) {
    int ans = d;
    for(int i=1; i<m; i++) ans += mon[i];
    if(isLeap(y) && m>2) ans++;
    return ans;
}
int main() {
    int y, m, d; cin>>y>>m>>d;
    cout<<get_day(y, m, d)<<endl;
    return 0;
}