枚举和模拟 下 习题
02 打印日期
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
示例1
输入:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
输出:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
解答
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
using namespace std;
//求当前天数的下一天的年月日
void NextDay(int& year, int& month, int& day) {
int dayOfMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//给一个年份 判断是不是闰年
//1 可以被100整除 也可以被400整除 是闰年
//2 不能被100整除 但是可以被4整除 是闰年
//判断是不是闰年
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
//此处 逻辑&&的优先级高于逻辑||
dayOfMonth[2] = 29;
}
else {
dayOfMonth[2] = 28;
}
day++;
//看加完以后的天数 有没有超过这个月的上限值
if (day > dayOfMonth[month]) {
day = 1;//日回归到1
month++;//月份往后走了一个月
}
//看加完以后的月数 有没有超过月份的上限值
if (month > 12) {
month = 1;
year++;
}
}
int main() {
int year, n;
while (scanf("%d %d", &year, &n) != EOF) {
int next = 1;
int curmonth = 1;
int curday = 1;
while (1) {
if (next == n) {
break;
}
NextDay(year, curmonth, curday);
next++;
}
//格式化输出 不足用0补充
/*
%04d: 这是一个格式说明符,
它告诉printf函数期望一个整数作为参数,
并将其格式化为至少4位数字,
如果不足4位,则在其左侧填充0。
*/
printf("%04d-%02d-%02d\n", year, curmonth, curday);
}
return 0;
}