今年的第几天
今年的第几天
http://www.nowcoder.com/questionTerminal/cc6ad889f95c49c08da1b338dd2e07ab
题目难度:一星
考察点:模拟
方法:模拟
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; }