hnu暑期实训之日历问题

文章目录

题目

在这里插入图片描述

思路

如果给定一个天数n,让我们确定它是2000年1月1日后的什么时间,那么我们应该是逐年计算,确定在哪一年后再逐月计算再确定天数即可。但是注意这个题目的描述,是从2000年1月1日开始记的,那么说明n=1的时候,应该是2000年1月2日周天。所以在计算完星期后,要将n++。因为星期是要累加的,而日子是直接计算出来的。

AC代码

#include <bits/stdc++.h>
using namespace std;

map<int, string> m1 = {
	{1, "Monday"},
	{2, "Tuesday"},
	{3, "Wednesday"},
	{4, "Thursday"},
	{5, "Friday"},
	{6, "Saturday"},
	{7, "Sunday"},
};

bool is_leap(int n) {
	if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) {
		return true;
	} else {
		return false;
	}
}

int day_of_year(int n) {
	if (is_leap(n))
		return 366;
	else
		return 365;
}

int day_of_month(int year, int n) {
	if (n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10 || n == 12)
		return 31;
	if (n == 2) {
		if (is_leap(year))
			return 29;
		else
			return 28;
	} else
		return 30;
}

int main() {
	int n;
	string Weekday;
	while (scanf("%d", &n), n != -1) {
		int day = n % 7 + 6;
		day = (day <= 7) ? day : day - 7;
		n++;
		int year = 2000;
		Weekday = m1[day];//星期数
		int remain_day = n;
		while (remain_day > 0) {
			remain_day -= day_of_year(year++);
		}
		//跳出来后remain_day是小于0的
		year -= 1;
		remain_day += day_of_year(year);
		int month = 1;
		while (remain_day > 0) {
			remain_day -= day_of_month(year, month++);
		}
		month--;
		remain_day += day_of_month(year, month);
		string date = to_string(remain_day);
		string date1 = to_string(month);
		if (month < 10) {
			date1 = '0' + date1;
		}
		if (remain_day < 10) {
			date = '0' + date;
		}
		cout << year << "-" << date1 << "-" << date << " " << Weekday << endl;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一袍清酒付825

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值