A96437.日期平移
2026-06-11 14:00:59
发布于:广东
20阅读
0回复
0点赞
直接模拟过程就好了
直接模拟过程就好了
直接模拟过程就好了
直接模拟过程就好了
题目理解
1、题目大概意思:
- 给定一个初始公历日期:年 Y、月 M、日 D。
- 接下来会有 Q 次操作,每次操作让日期往前 / 往后平移若干天。
- 要求:按顺序执行完所有操作,输出最终的年月日。
2、就两种操作(记住就好了):
每行输入 op x:
- op = 1, x = 1:向后(未来)平移 x 天:2020-02-28 往后移 1 天 → 2020-02-29
- op = 2, x = 2:向前(过去)平移 x 天:2020-03-01 往前移 1 天 → 2020-02-29
注意:x 都是非负数,只代表移动天数,方向由 op 决定。
3、移动规则:
先判断是不是闰年,这样子决定2 月有多少天:
闰年判断规则:
- 能被 400 整除 → 闰年(2 月 29 天)
- 能被 4 整除 但 不能被 100 整除 → 闰年(2 月 29 天)
- 其他情况 → 平年(2 月 28 天)
4、平年固定:
| 月份 | 天数 |
|---|---|
| 1月 | 31 |
| 2月 | 判断 |
| 3月 | 31 |
| 4月 | 30 |
| 5月 | 31 |
| 6月 | 30 |
| 7月 | 31 |
| 8月 | 31 |
| 9月 | 30 |
| 10月 | 31 |
| 11月 | 30 |
| 12月 | 31 |
可以用数组存储每月的天数
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
解题思路:
核心需求:日期加减天数,处理跨年、跨月、闰年二月天数差异。
- 先写闰年判断函数,按题目规则判定闰年;
- 写每月天数数组,区分平年 / 闰年的 2 月;
- 统一逻辑:
- 向后加天数:日期不断 +1,当月天数不足则进一月 / 一年;
- 向前减天数:日期不断 -1,当月天数不足则退一月 / 一年;
我们可以拆解一下步骤:
算了,算了,直接上代码,自己理解吧
#include <bits/stdc++.h>
using namespace std;
int Y, M, D, Q;
bool runnian(int y){
if(y % 400 == 0) {
return true;
}
if(y % 4 == 0 && y % 100 != 0) {
return true;
}
return false;
}
int tianshu(int y, int m) {
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(m == 2 && runnian(y)){
return 29;
}
return days[m];
}
int main() {
cin >> Y >> M >> D >> Q;
long long py = 0;
for (int i = 1; i <= Q; i++) {
int op, x;
cin >> op >> x;
if (op == 1) {
py += x;
}else {
py -= x;
}
}
// 向后偏移
while (py > 0) {
D++;
int md = tianshu(Y, M);
if (D > md) {
D = 1;
M++;
if (M > 12) {
M = 1;
Y++;
}
}
py--;
}
// 向前
while (py < 0){
D--;
if (D < 1){
M--;
if (M < 1){
M = 12;
Y--;
}
D = tianshu(Y, M);
}
py++;
}
cout << Y << " " << M << " " << D << endl;
return 0;
}
全部评论 3
nb
1周前 来自 广东
0nb
1周前 来自 广东
0nb
1周前 来自 广东
0











有帮助,赞一个