题目1186:打印日期(日期计算)
问题来源
http://ac.jobdu.com/problem.php?pid=1168
问题描述
给出年份m和这一年中的第n天,算出第n天是几月几号。
问题分析
我们开一个二维数组来记录每个月的天数,有人好奇,为什么是二维数组,不是一维就够了吗?这里我们考虑到二月份闰年的关系,把二维数组形式开成如下代码中的样子,第二维代表是不是闰年,方便快速查询。
另外,判断闰年是一个经常用的东西,可以写成宏定义:#define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0
还有输出格式,yyyy-mm-dd格式,用printf函数更好写:printf("%04d-%02d-%02d\n",y,i,n);
PS:普及一下printf输出格式。C语言格式化输出默认为右对齐,+表示右对齐,-表示左对齐
printf ("%-08ld\n",y)默认在后面补两个' ',不可能补0,补0就改变了数值大小,所以和0没关系
printf ("%08ld\n",y)为右对其,前补0,结果都为-0043456
printf ("%+8ld\n",y)为右对齐,前补空格,结果为**-43456 注意:此处的星号表示空格!!(因为打空格怕你看不出来。。。)
参考代码
// // Created by AlvinZH on 2017/5/2. // Copyright (c) AlvinZH. All rights reserved. // #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; //判断闰年 #define ISYEAP(x) x%100!=0&&x%4==0||x%400==0?1:0 int DayOfMonth[13][2]={ 0,0, 31,31, 28,29, 31,31, 30,30, 31,31, 30,30, 31,31, 31,31, 30,30, 31,31, 30,30, 31,31 }; int main() { int y; int n; while(~scanf("%d %d",&y,&n)) { for(int i=1;i<=12;i++) { if(n>DayOfMonth[i][ISYEAP(y)]) n-=DayOfMonth[i][ISYEAP(y)]; else { printf("%04d-%02d-%02d\n",y,i,n); break; } } } }
作者: AlvinZH
出处: http://www.cnblogs.com/AlvinZH/
本人Github:https://github.com/Pacsiy/JobDu
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.