算法练习——日期问题

1.基础循环遍历模板

for (int year = 2000; year <= 2022; year++) {
	for (int month = 1; month <= 12; month++) {
		for (int day = 1; day <= 31; day++) {
			if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12);
			else if (month == 2) {
				if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
					if (day > 29) break;
				}
				else {
					if (day > 28) break;
				}
			}
			else {
				if (day > 30) break;
			}
		}
	}
}

2.例题套用一

1) 题目描述

在 X 星系的广袤空间中漂浮着许多 X 星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。 有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

2) 解题思路

设置一个 flag 标志,在遍历到2014年11月9日这天时将 flag 置为1,接着只要 flag 为1,都将计数器 cnt+1,那么意味着2014年11月9日之后的遍历的每天都能使计数器 cnt+1,只要最终 cnt ==1001,就能得到最终的日期。

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int flag = 0, cnt = 0;
	for (int year = 2014; year <= 2018; year++) {
		for (int month = 1; month <= 12; month++) {
			for (int day = 1; day <= 31; day++) {
				if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12);
				else if (month == 2) {
					if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
						if (day > 29) break;
					}
					else {
						if (day > 28) break;
					}
				}
				else {
					if (day > 30) break;
				}
				//添加的部分-----------
				if (year == 2014 && month == 11 && day == 9) {
					flag = 1;
				}
				if (flag == 1) { cnt += 1; }
				if (cnt == 1001) {
					cout << year << "--" << month << "--" << day << endl;
					printf("%d--%02d--%02d", year, month, day);
					break;
				}
				//----------------------
			}
		}
	}
	return 0;
}

3) 运行结果

4) 细节问题

  • 间隔天数

cnt ==1001的1001如何得出?

根据题目炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸,对应2015年1月1日时flag 为1,cnt 由0变1,接着2015年1月2日时 flag 仍为1,cnt由1变2;以此类推,2015年1月16日时,cnt 由15变16,16这个值比定时的15多一天,那么在判断间隔1000天的时候 cnt 值也对应比定时的1001多1,即为1001。

  • 输出问题

在使用 cout 输出时,如果使用单引号引用 -- ,就会出现异常数字。

 3.例题套用二

1) 题目描述

2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第几天?

2) 解题思路

设置一个计数器 cnt,从2000年的1月1日开始每天+1,直至2000年的5月4日加完停止,输出计数器 cnt 的值。

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int flag = 0, cnt = 0;
	for (int year = 2000; year <= 2018; year++) {
		for (int month = 1; month <= 12; month++) {
			for (int day = 1; day <= 31; day++) {
				if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12);
				else if (month == 2) {
					if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
						if (day > 29) break;
					}
					else {
						if (day > 28) break;
					}
				}
				else {
					if (day > 30) break;
				}
				//添加的部分-----------
				if (year == 2000 && month == 1 && day == 1) {
					flag = 1;
				}
				if (flag == 1) { cnt += 1; }
				if (year == 2000 && month == 5 && day == 4) {
					cout << cnt << endl;
					
					break;
				}
				//----------------------
			}
		}
	}
	return 0;
}

3) 运行结果

4.题目升级

1) 题目描述

增加日期与时间之间的转换,问从1921年7月23日中午12时到2020年7月1日中午12时一共包含多少分钟?

2) 解题思路

根据之前的模板算出间隔天数,再乘以每天的分钟数即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int flag = 0, cnt = -1;
	for (int year = 1921; year <= 2020; year++) {
		for (int month = 1; month <= 12; month++) {
			for (int day = 1; day <= 31; day++) {
				if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12);
				else if (month == 2) {
					if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
						if (day > 29) break;
					}
					else {
						if (day > 28) break;
					}
				}
				else {
					if (day > 30) break;
				}
				//添加的部分-----------
				if (year == 1921 && month == 7 && day == 23) {
					flag = 1;
				}
				if (flag == 1) { cnt += 1; }
				if (year == 2020 && month == 7 && day == 1) {
					cout << (cnt*24*60) << endl;
					
					break;
				}
				//----------------------
			}
		}
	}
	return 0;
}

3) 运行结果

4) 细节问题

注意这题的代码中 cnt 的初值是 -1,因为是从1921年7月23日中午12时开始算的,直到1921年7月24日中午12时才能被记成完整的一天24小时,所以将 cnt 的初值设置为 -1,满足1921年7月23日这天 cnt 由-1变0,而1921年7月24日中午12时 cnt 由0变1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ItsWendy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值