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。