GESP2025年3月认证C++二级( 第三部分编程题(2)时间跨越)
参考程序:
#include <iostream>
using namespace std;int main() {int y, m, d, h, k; // y: 年,m: 月,d: 日,h: 小时,k: 跨越的小时数cin >> y >> m >> d >> h >> k;h += k; // 累加小时数if (h >= 24) {h -= 24; // 超过一天就减掉 24 小时d += 1; // 天数加一int days = 0; // 当前月份的天数if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {days = 31;} else if (m == 4 || m == 6 || m == 9 || m == 11) {days = 30;} else if (m == 2) {// 闰年判断if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {days = 29;} else {days = 28;}}if (d > days) {d -= days; // 超过这个月的天数,减去当前月天数m += 1; // 月份进位if (m > 12) {m = 1;y += 1; // 年份进位}}}cout << y << " " << m << " " << d << " " << h << "\n";return 0;
}
参考程序2:
#include <iostream>
using namespace std;// 判断某年是否是闰年
bool isLeap(int y) {return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}// 返回某月的最大天数
int getDays(int y, int m) {if (m == 2) return isLeap(y) ? 29 : 28;if (m == 4 || m == 6 || m == 9 || m == 11) return 30;return 31;
}int main() {int y, m, d, h, k;cin >> y >> m >> d >> h >> k;// 小时处理h += k;d += h / 24;h %= 24;// 处理跨天跨月跨年while (true) {int daysInMonth = getDays(y, m);if (d <= daysInMonth) break; // 当前月不需要进位d -= daysInMonth;m++;if (m > 12) {m = 1;y++;}}cout << y << " " << m << " " << d << " " << h << "\n";return 0;
}